我有一份工作要处理大约100K的记录。此作业截断目标表,然后在这些表中“一次”插入所有记录,而不是批量插入。
我需要知道在插入这些记录时索引会如何生效?在工作期间创建索引的成本是否会超过使用它们的好处?
在这种情况下是否有任何最佳做法或优化提示?
答案 0 :(得分:3)
此类问题只能根据具体情况进行解答。但是,以下一般性考虑可能有所帮助:
通常,添加100,000条记录对于MS-SQL来说是“小土豆”,除非特殊情况(例如异常宽的记录)或存在许多(可能定义不明确)的各种性质的约束,SQL Server应该在大多数硬件配置中,在几分钟而不是几小时内处理此负载。
答案 1 :(得分:1)
这个问题的答案是非常不同的,这取决于你所谈论的索引是否是聚集的。聚簇索引强制SQL Server按排序顺序存储数据,因此,如果您尝试插入未排序到聚簇索引末尾底部的记录,则插入操作可能导致数据重新调整,因为许多移动记录以为您的新记录腾出空间。
非聚簇索引没有此问题;服务器所要做的就是跟踪新记录的存储位置。因此,如果您的索引是群集的(大多数聚簇索引是主键,但这不是必需的;运行“sp_helpindex [TABLENAME]”以确定),在所有插入之后添加索引几乎肯定会更好完成。
关于非聚簇索引上插入的性能,我实际上无法告诉你;根据我的经验,放缓并不足以让人担心。在这种情况下,索引开销将远远超过一次执行所有插入操作的开销。
编辑:因为您可以在性能方面截断整个表,所以在执行所有插入操作之前,几乎可以放弃(或者检查)索引和约束,然后将其添加回来。结束。
答案 2 :(得分:0)
insert语句是唯一不能直接从索引中获益的操作,因为它没有where子句。
索引表越多,执行速度越慢。
如果表上有索引,则数据库必须确保通过这些索引找到新条目。因此,它必须将新条目添加到该表的每个索引。因此,索引的数量是insert语句的成本的乘数。