在大型INSERT INTO语句期间SQL Server文件组已满

时间:2009-11-23 17:04:17

标签: sql-server sql-server-2000 sql-server-express filegroup autogrow

考虑一个SQL脚本,用于在SQL 2000数据库中将行从一个表复制到另一个表。转移涉及750,000行简单:

INSERT INTO TableB([ColA],[ColB]....[ColG])
SELECT [ColA],[ColB]....[ColG]
FROM  TableA

这是一个长时间运行的查询,可能部分原因是ColB的类型为ntextCONVERT()语句中有少量SELECT次操作。

难点在于操作约15分钟后,SQL Server会引发此异常。

  

无法为对象“[TABLE]”分配空间。'[PRIMARY_KEY]'在数据库'[DB]'中,因为'PRIMARY'文件组已满。   通过删除不需要的文件,删除文件组中的对象,向文件组添加其他文件或为文件组中的现有文件设置自动增长来创建磁盘空间。

更多信息

  • Autogrowth已经开启。
  • 磁盘上有足够的可用空间(~20GB)
  • 单个.mdf是~6gb
  • 源表或目标表上没有触发器

alt text

alt text问题

需要通过Management Studio或T-SQL设置哪些选项才能使数据库按需增长?你会建议其他什么补救措施?

解决

db无法根据需要增长,因为我在SQL Server 2008 Express 的实例上托管此数据库。升级到非绝育版本的SQL Server将解决此问题。

alt text

3 个答案:

答案 0 :(得分:1)

最佳建议:预先调整数据库的大小,而不是强制按需增长(这可能是一个缓慢的操作)。

可能发生此错误的一个原因是您的自动增长间隔设置得太大。除了显而易见的(尝试在磁盘上只增加20GB的情况下增长25GB),大的增长间隔可能需要很长时间才能分配,这可能会导致查询超时。

编辑:根据您的新屏幕截图,看起来区间不是问题。但是,我原来的建议仍然存在。尝试自己手动扩展数据库,看看它是否允许你:

ALTER DATABASE foobar
MODIFY FILE (name = foobar_data, size = 5000)

答案 1 :(得分:0)

如果您可以共享关于PRIMARY文件组构成和自动增长设置的屏幕截图/信息(即PRIMARY中包含的所有文件以及每个文件的自动增长设置),这也是有用的。首先想到的是没有看到任何额外的东西,你可能会为构成你的PRIMARY组的一个/多个文件指定一个maxFileSize,但这只是一个预感而没有真正看到这些信息。

答案 2 :(得分:0)

桌面上是否有任何触发器?我之前看到类似的结果,当有触发器时,它实际上是日志文件(ldf)的扩展,它只是记录了触发器而不是mdf本身运行的所有查询。如果有任何触发器,我会考虑在执行此更新时禁用它们并查看是否有帮助(我认为这是一次性数据迁移而不是重复发生的事件?)