SQL Server 中的 Insert/Update/Delete 语句应使用哪种类型的索引(聚集/非聚集)。我知道它会产生额外的开销,但与非聚集索引相比,它的性能更好吗? SQL Server 中的 Select 语句应该使用哪个索引?
最佳答案
不能 100% 确定您期望听到什么 - 您只能在一个表上有一个聚簇索引,默认情况下,每个表(除了极少数边缘情况异常(exception))都应该有一个。所有索引通常对您的 SELECT 帮助最大,有些索引往往会对 INSERT、DELETE 和可能的 UPDATE 造成一点伤害(如果选择不当,可能会伤害很多)。
聚簇索引使表的每个操作都更快。是的!确实如此。查看 Kim Tripp 的优秀 The Clustered Index Debate continues了解背景信息。她还提到了她对聚簇索引的主要标准:
- 缩小
- 静态(永不改变)
- 独一无二
- 如果可能的话:不断增加
INT IDENTITY 完美地实现了这一点——GUID 却没有。参见 GUID's as Primary Key获取广泛的背景信息。
为什么要缩小?因为聚簇键被添加到同一个表上的每个非聚簇索引的每个索引页(为了能够实际查找数据行, 如果需要的话)。你不想在你的集群键中有 VARCHAR(200)....
为什么是唯一的?? 见上文 - 聚簇键是 SQL Server 用来唯一地查找数据行的项目和机制。它必须是独一无二的。如果您选择一个非唯一的集群键,SQL Server 本身将向您的键添加一个 4 字节的唯一标识符。小心点!
下一步:非聚集索引。基本上有一个规则:引用另一个表的子表中的任何外键都应该被索引,它会加速 JOIN 和其他操作。
此外,任何具有 WHERE 子句的查询都是一个很好的候选者 - 选择最先执行的查询。在 ORDER BY 语句中的 WHERE 子句中显示的列上放置索引。
下一步:测量您的系统,检查 DMV(动态管理 View )以获取有关未使用或缺失索引的提示,并一遍又一遍地调整您的系统。这是一个持续的过程,您永远不会完成!
另一个警告:使用大量索引,您可以使任何 SELECT 查询运行得非常非常快。但与此同时,必须更新所有相关索引的 INSERT、UPDATE 和 DELETE 可能会受到影响。如果你只选择 - 去吧!否则,这是一种微妙而微妙的平衡行为。您总是可以难以置信地调整单个查询 - 但您系统的其余部分可能会因此而受到影响。不要过度索引您的数据库!放置一些好的指标,检查并观察系统的行为方式,然后再添加一两个指标,然后再重复一遍:观察整个系统性能如何受其影响。
关于sql-server - 聚簇索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2701777/