使用BulkCopy类将一个大约17M行(大小约为2GB)的表加载到SQLServer时,服务器在加载大约6M条记录后似乎无声地耗尽内存。也就是说,我占用了系统内存的90%以上,然后在没有引发内存不足的情况下无声地继续尝试加载变得非常慢的数据。
还有其他人遇到过类似问题吗?有没有办法告诉SQLServer清除一些内存而不重新启动它?如果不是,有人能告诉我如何以编程方式重启服务器吗?
PS:我已经确认我的程序不会占用内存。[编辑]我正在运行64位Windows 7,64位sqlserver 2008 R2,内存为8 GB。
答案 0 :(得分:3)
SQL Server将分配系统上可用的所有内存。一旦达到最大内存,它将保持在那里并且不释放该内存。这是设计意图的行为。
您没有告诉我们一些重要的信息:
我怀疑你看到的东西实际上是完全不相关的:在6M行,你的测试开始生长文件而你没有打开instant file initialization。有很多性能指标可以看:
并且,与任何SQL Server疑难解答问题一样,遵循Waits and Queues方法不会有任何损害。最后,如果确实存在内存压力问题,则有指导如何在Using DBCC MEMORYSTATUS to Monitor SQL Server Memory Usage进行调查。
答案 1 :(得分:1)
Sql有一些开销用于将所有数据加载到内存中,所以当你可能有2GB的原始数据时,会有元数据和指针等必须加载到内存中以跟踪这些事情。在您的系统上发生的事情是,您的RAM存储空间不足以将所有内容保存在内存中,因此必须将某些页面(操作系统用于将虚拟地址转换为物理地址的单元)交换到硬盘驱动器(非常慢),以便房间可以存储更多信息。通常将数据库完全加载到内存中会这样做,因为数据库可能会变得非常大。 Sql server具有自定义内存管理功能,因此通常可以清除最近未使用但不太可能在不久的将来使用的内容。
当发生这种情况时重新启动Sql实际上是唯一一种简单的方法,具体取决于您的特定版本的Sql(MySql,MsSql等等),有方法可以以编程方式重新启动服务器。