【发布时间】:2014-09-18 10:19:57
【问题描述】:
截断超过 600 万行的表后,插入/选择速度很慢。
我每天向表中插入 5 到 6 百万条记录,并且我能够在 7 或 8 天内毫无问题地插入/选择数据,但是当表大小超过 10 GB/3000 万行时,就会出现一些超时问题。
所以我想在上传数据之前每天截断表格,因为 1 天的数据对我来说已经足够了。现在我看到插入/选择非常缓慢,直到我在上传中间重建索引。过去 2 天,插入 100 万行需要 5 个小时,在重建索引后,剩余的 3.5 到 400 万行在不到 15 分钟的时间内进入表中。我不喜欢在上传过程中重建索引。
我不做 .NET Bulk insert ,我使用 Stored proc 批量插入行,因为我做了一些验证。
我使用的是 SQL Server 2008。
【问题讨论】:
-
这个问题很可能不是由于截断。截断后是否立即开始缓慢?持续多久?你如何定义“慢”?你是怎么测量的?
-
truncate后很慢,插入100万行花了将近5个小时。然后在重建索引之后,剩余的 450 万行在不到 15 分钟的时间内被插入。我不做 .NET Bulk insert ,我使用 Stored proc 批量插入行,因为我做了一些验证。
-
对不起,缓慢直到我重建索引。缓慢我的意思是插入记录的持续时间,通常(6 到 7 天)插入一批 80K 行需要不到 5 或 6 秒的时间,但是自从我开始截断同一批需要几分钟。在我重建索引后,一切都恢复正常。我不喜欢在上传过程中重建索引。
-
该信息很有帮助。一个不寻常的案例。没有明显问题。您是否启用了自动更新统计信息?服务器有多少内存?更新该表的统计信息但未重建索引后,该过程是否又快了?
-
否,自动更新统计未启用。我们有近 1TB 的内存,我们使用 SAN 磁盘。我没有尝试更新统计,因为它是生产数据库,等待批准。我们在测试环境中没有这个问题,它有 100GB 的内存。 5/6 百万行也消耗 1.7 到 1.8 GB 的内存。我们的数据库增长了 1GB。
标签: sql sql-server performance sql-server-2008 truncate