sql-server - 困惑: Why SSMS creates a default clustered index for a primary key with an identity

标签 sql-server database-design indexing ssms-2012

我刚刚执行了以下脚本

CREATE TABLE Test
(
    ID INT IDENTITY PRIMARY KEY,
    Info nvarchar(50)
)

令我惊讶的是,SSMS 为 ID 列创建了聚集索引。所以,我的问题是为什么不使用非聚集索引呢?

根据我的理解,在这种情况下最好使用非聚集索引,因为由于二叉树,查找值为 X 的 ID 而不是使用聚集索引要快得多其中值以某种方式分组。另外,如果我考虑接收数据,则必须以某种方式快速访问 ID。正如许多文章所写的那样,二叉树是接收特定或多个 ID 的快速方法。除此之外,我发现在大多数情况下,任何表的主键都是具有自动递增值的 ID。所以使用这种自动递增原理的方法是很常见的。

那么,使用非聚集 key 的优势是什么?为什么 SSMS 中会默认使用非聚集 key ?

最佳答案

默认情况下,表的主键由聚集索引支持 - 这只是 SQL Server 默认行为。如果需要,可以更改它:

CREATE TABLE Test
(
    ID INT IDENTITY PRIMARY KEY NONCLUSTERED,
    Info nvarchar(50)
)

但特别是在 INT IDENTITY 情况下,这几乎是您可以想象到的表上的完美聚集索引 - 因此 SQL Server 做出此默认选择是一件“好事”。

SQL Server 中的每个“严肃”表都应该有一个精心选择的聚集索引(因为替代方案 - - 在各个方面进行微调都更慢且更麻烦) - 以及像INT IDENTITY这样的小(4字节)、静态(永远不会改变)、唯一的列非常适合作为该表上的聚集索引。

如果您想详细了解如何明智地选择聚类键,以及为什么这样做如此重要,您应该查看 Kimberly Tripp 就该主题所说的所有内容:

关于sql-server - 困惑: Why SSMS creates a default clustered index for a primary key with an identity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14057712/

相关文章:

Python - 字符串的最大索引值

sql - where 子句中的列别名给出无效的列名错误

sql-server - SQL Server - 指定一天中的时间进行分组

ruby-on-rails - 数据库 - 动态表选择

mysql索引和优化,使用where;使用临时的;使用文件排序

python - 如何将 Pandas Dataframe 偏移/移动到另一年?

SQL:构建 where 子句

c# - 在 Sql 中重命名表,并相应地在 Entity Framework 中重命名表(Db First)

php - 建模人员/公司角色

MySQL - 行大小如何超过 65535