【发布时间】:2009-11-13 23:27:11
【问题描述】:
我有一份工作需要处理大约 10 万条记录。此作业截断目标表,然后在这些表中“一次一个”插入所有记录,而不是批量插入。
我需要知道插入这些记录时索引将如何产生影响?在工作期间创建索引的成本是否会超过使用它们的好处?
在这种情况下是否有任何最佳实践或优化提示?
【问题讨论】:
标签: sql sql-server sql-server-2005 performance
我有一份工作需要处理大约 10 万条记录。此作业截断目标表,然后在这些表中“一次一个”插入所有记录,而不是批量插入。
我需要知道插入这些记录时索引将如何产生影响?在工作期间创建索引的成本是否会超过使用它们的好处?
在这种情况下是否有任何最佳实践或优化提示?
【问题讨论】:
标签: sql sql-server sql-server-2005 performance
这类问题只能逐案回答。但是,以下一般注意事项可能会有所帮助:
一般来说,添加 100,000 条记录对于 MS-SQL 来说是“小土豆”,除非有特殊情况,例如异常宽的记录,或者存在许多(并且可能定义不明确的)各种性质的约束,SQL Server 应该在大多数硬件配置中,只需几分钟而不是几小时即可处理此负载。
【讨论】:
这个问题的答案非常不同,具体取决于您所讨论的索引是否是集群的。聚集索引强制 SQL Server 以排序顺序存储数据,因此,如果您尝试插入一条未排序到聚集索引末尾底部的记录,您的插入可能会导致您的数据显着重新洗牌,因为您的许多记录被移动以便为您的新记录腾出空间。
非聚集索引没有这个问题;服务器所要做的就是跟踪新记录的存储位置。因此,如果您的索引是聚集索引(大多数聚集索引是主键,但这不是必需的;运行“sp_helpindex [TABLENAME]”以确定),您几乎肯定最好在所有插入后添加索引完成。
关于非聚集索引上的插入性能,我实际上无法告诉你;以我的经验,放缓还不足以担心。在这种情况下,一次执行所有插入的开销将大大超过索引开销。
编辑:由于您可以截断整个表,就性能而言,您几乎肯定最好在执行所有插入之前删除(或 NOCHECKing)您的索引和约束,然后将它们添加回结尾。
【讨论】:
insert 语句是唯一不能直接从索引中受益的操作,因为它没有 where 子句。
索引表越多执行越慢。
如果表上有索引,数据库必须确保通过这些索引也可以找到新条目。出于这个原因,它必须将新条目添加到该表上的每个索引中。因此,索引的数量是插入语句成本的乘数。
【讨论】: