sql-server - 聚簇索引

标签 sql-server database performance indexing database-indexes

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/

相关文章:

c# - 通过 Entity Framework 6 中另一个表中的外键获取记录

sql-server - 我应该避免使用 TEXT、NTEXT 数据类型吗?

database - Oracle 表中的空白字段(即列)是否还会占用磁盘空间?

sql - 一定数量的记录后,Postgres 服务器性能下降

sql-server - 多线程中的临时表

sql-server - 如何使用 FTP 任务为 SSIS 包配置 Azure VM

sql - SQL Server 如何判断输入日期的格式?

php - 具有内连接的 UNION SELECT 表和带有 "ALIAS"的 GET 值

java - 循环两次但在 JAVA 中花费相同的时间

c# - 如何以不错的速度在 C#/WinForms 中绘图?