在sql server中具有索引列的记录上发生更新时,内部发生了什么

时间:2014-06-02 16:59:18

标签: sql-server

我知道当一个表有索引列时,sql server会复制这些列的数据,以便可以快速访问它而无需查看每个记录。如果索引被其他列覆盖,那么所有这些包含的列也会与索引列一起存储。

所以,我假设当任何索引列或包含列发生更新时,很明显更新应该在实际记录位置和索引位置发生。这一点对我来说很有意思,因为如果一个表预计会有更多的更新而不是搜索,那么获取索引会不会是开销?我想对此进行确认,并且还希望了解更新发生时屏幕背后实际发生的内容。

2 个答案:

答案 0 :(得分:0)

是的,你说得对。添加索引时需要权衡。它们有可能使选择更快,但它们会使更新/插入/删除更慢。

答案 1 :(得分:0)

设计索引时,请考虑以下数据库准则:

  • 表上的大量索引会影响INSERT,UPDATE,DELETE和MERGE语句的性能,因为必须根据表中的数据更改来适当调整所有索引。例如,如果在多个索引中使用了一列,并且您执行了修改该列数据的UPDATE语句,则必须更新包含该列的每个索引以及底层基表中的列(堆或群集)索引)。
  • 避免对大量更新的表进行过度索引,并使索引保持较窄,即使用尽可能少的列。
  • 使用许多索引来提高具有较低更新要求但数据量较大的表的查询性能。大量索引可以帮助执行不修改数据的查询(如SELECT语句),因为查询优化器有更多索引可供选择,以确定最快的访问方法。
  • 索引小表可能不是最佳的,因为它可以使查询优化器更长时间遍历索引搜索数据而不是执行简单的表扫描。因此,可能永远不会使用小表上的索引,但仍必须在表中的数据更改时进行维护。

有关详细信息,请查看以下链接: -

http://technet.microsoft.com/en-us/library/jj835095(v=sql.110).aspx