索引和插入操作

时间:2009-11-13 23:27:12

标签: sql sql-server sql-server-2005 performance

我有一份工作要处理大约100K的记录。此作业截断目标表,然后在这些表中“一次”插入所有记录,而不是批量插入。

我需要知道在插入这些记录时索引会如何生效?在工作期间创建索引的成本是否会超过使用它们的好处?

在这种情况下是否有任何最佳做法或优化提示?

3 个答案:

答案 0 :(得分:3)

此类问题只能根据具体情况进行解答。但是,以下一般性考虑可能有所帮助:

  • 除非插入的某些数据来自额外的查找等,否则在INSERT期间没有索引是有用的(即对于这个非常的操作,索引当然可以用于其他会话/用户下的其他查询....)
  • [另一方面......]表上存在索引会减慢INSERT(或更常见的UPDATE或DELETE)操作
  • 添加新记录的顺序可能很重要
  • 如果表格是聚集索引,则需要特别考虑
  • 在INSERT操作之前决定是否删除索引(所有这些索引或其中一些索引)在很大程度上取决于记录的相对数量(添加与容易相关)
  • INSERT操作可能经常引入索引碎片,这本身就是在数据加载之前可能删除索引,然后重建它(它们)的额外动机。

通常,添加100,000条记录对于MS-SQL来说是“小土豆”,除非特殊情况(例如异常宽的记录)或存在许多(可能定义不明确)的各种性质的约束,SQL Server应该在大多数硬件配置中,在几分钟而不是几小时内处理此负载。

答案 1 :(得分:1)

这个问题的答案是非常不同的,这取决于你所谈论的索引是否是聚集的。聚簇索引强制SQL Server按排序顺序存储数据,因此,如果您尝试插入未排序到聚簇索引末尾底部的记录,则插入操作可能导致数据重新调整,因为许多移动记录以为您的新记录腾出空间。

非聚簇索引没有此问题;服务器所要做的就是跟踪新记录的存储位置。因此,如果您的索引是群集的(大多数聚簇索引是主键,但这不是必需的;运行“sp_helpindex [TABLENAME]”以确定),在所有插入之后添加索引几乎肯定会更好完成。

关于非聚簇索引上插入的性能,我实际上无法告诉你;根据我的经验,放缓并不足以让人担心。在这种情况下,索引开销将远远超过一次执行所有插入操作的开销。

编辑:因为您可以在性能方面截断整个表,所以在执行所有插入操作之前,几乎可以放弃(或者检查)索引和约束,然后将其添加回来。结束。

答案 2 :(得分:0)

insert语句是唯一不能直接从索引中获益的操作,因为它没有where子句。

索引表越多,执行速度越慢。

如果表上有索引,则数据库必须确保通过这些索引找到新条目。因此,它必须将新条目添加到该表的每个索引。因此,索引的数量是insert语句的成本的乘数。

Check here