SQL服务器中的巨大表(900万条记录)

Mat*_*wdy 8 sql-server-2008 windows-7

我们的承保公司刚刚向我们发送了潜在客户的数据摘录.有900万行.行包括LeadID(guid),RawLeadXML(xml - 可能最大3-4kb)和LeadStatusID(int).

我首先尝试添加一个自动编号整数,并使其成为该表的主键.好吧,它添加了字段,但无法使其成为主键(缓冲池中没有足够的可用内存.)

我需要做的是获取每个记录,逐个1,并获取XML,将其放入.Net中的XmlDocument对象,删除我想要的所有字段(名字,姓氏等)并将解析后的信息存储到另一张桌子.

我甚至无法运行此语句:select*from Leads其中id介于1和1000之间

如果我一次只选择1000条记录(从Leads中选择前1000条),那就可行,但是如何在没有某种参考点的情况下选择接下来的1000条记录呢?

我的机器有4个处理器(2.53Ghz)和12 GB的RAM.它不是服务器,但它是一台强大的机器.老实说,我不知道下一步该尝试什么.

编辑:我遗漏了原始文件实际上是一个MDF(和相关的LDF)文件,所以我只是在SQL Server中附加到它们.

编辑2:我搞砸了说RawLeadXML列是XML - 它不是,它只是nvarchar(max).老实说,我不知道有一个xml数据类型.

编辑3:我甚至无法在此表上发出删除声明:"从leadid ='100a7927-5311-4f12-8fe3-95c079d32dd4'的引线中删除"爆炸:

Msg 802, Level 17, State 20, Line 2
There is insufficient memory available in the buffer pool.
Run Code Online (Sandbox Code Playgroud)

我不知道接下来该做什么.这到底是怎么回事?世界上有成千上万的数据库,记录的数量超过了我的数据.

编辑4:如果有人关心,以下解决方案均无效.我确信这是我机器的限制,绝对不是对我在下面收到的好答案的谴责.目前,我正在将压缩数据库(2.6 GB)传输到Rackspace中的服务器,然后我将尝试在该硬件上添加索引,希望不会关闭我们的生产服务器.一旦添加了索引,我希望我可以压缩数据库并将其恢复到我的本地计算机,然后能够实际执行某些操作.

编辑5:我的机器实际上无法处理这种尺寸的桌子.我的机器有12 GB RAM,64位Windows 7专业版,四核2.53Ghz处理器,SSD驱动器等.它对于开发机器来说非常强大.它无法解决这个问题.

所以,我将数据库移到伦敦Rackspace的服务器上.48 GB或那个内存,它能够添加我需要的索引.即使在那之后,我的机器也无法做任何对它有用的事情,所以我写了一个在伦敦运行的.Net程序,一次输出1000个记录,将它们解析到另一个表中,然后将原始记录标记为已处理.

一旦我这样做,我将不得不离开伦敦的数据库,因为我怀疑我能在本地写出任何有意义的报告来反对这种怪异.这将使开发变得有趣.

简介:我认为没有使用至少48 GB RAM的服务器类硬件(在我的情况下)处理这么大的数据集的好方法.

Rem*_*anu 9

错误802并不意味着在经典意义上的内存不足以进行分配(这将触发错误701).错误802实际上表示缓冲池无法增长,这可能由于以下几个原因而发生:

  • 最大服务器内存设置明确阻止缓冲池增长,检查您的服务器设置.
  • 命中x86虚拟地址空间限制并且未启用AWE.检查是否有x86(32位)实例,如果是,请检查是否满足启用AWE的所有条件.

如果您仍未找到问题,请阅读如何使用DBCC MEMORYSTATUS命令监视SQL Server 2005上的内存使用情况(该文章同样适用于SQL Server 2008和2008 R2)并遵循其中的指导原则来了解谁/什么消耗你的记忆.


Vol*_*lan 4

900 万行并不算大,您可能在 LeadId 列上没有索引。首先创建一个,尽管这需要一些时间(不必是唯一的或主键)。比对第一个查询使用“SELECT TOP 1000 LeadId, RawXML ORDER BY LeadId”。记录最后的 LeadId (MaxLeadId) 值,使用“SELECT TOP 1000 LeadId, RawXMLWhere LeadId > MaxLeadId ORDER BY LeadId”等...