【发布时间】:2013-06-21 17:00:29
【问题描述】:
假设我有一张这样的桌子。 Id 是主键,所以我知道我得到了一个索引。
CREATE TABLE Employer
(
Id VARCHAR(64) NOT NULL,
EntityId VARCHAR(64) NOT NULL,
Name VARCHAR(64) NOT NULL,
Address1 VARCHAR(64) NOT NULL,
Address2 VARCHAR(64) NOT NULL,
City VARCHAR(64) NOT NULL,
JobTitle VARCHAR(64) NOT NULL,
StateCode VARCHAR(64) NOT NULL,
ZipCode VARCHAR(64) NOT NULL,
CONSTRAINT PK_Employer_Id PRIMARY KEY CLUSTERED (Id ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)
假设我添加了另一个索引来帮助进行一些特殊搜索(尽管原因并不相关)。是否有理由将 Id(主键)作为索引中的列之一包含在内? SQL 专家告诉我这是浪费空间,因为索引已经以某种方式包含主键。
CREATE INDEX [idxEmployerByNameAddress1City] on [Employer] ([EntityId], [Id], [Name], [Address1], [City])
【问题讨论】:
-
请 - 不要将
VARCHAR(64)设为您的聚集索引!这对性能来说真的非常糟糕...... SQL Server 表上的聚集索引应该很小(4-8 字节)和固定宽度(不是可变宽度,如VARCHAR(64)) -INT IDENTITY几乎完美的。阅读 Kimberly Tripp's Ever-increasing clustering key – the Clustered Index Debate……….again! 博客文章以及她在聚集索引上发布的任何内容 - 她是 SQL Server 索引女王 - 听从她的建议! -
您的集群键(默认情况下是主键)将自动成为每个非聚集索引的一部分——这也是集群键应该很小且性能良好的另一个原因!但是单独添加
ID并不浪费空间——它无论如何都包含在该索引中,如果你明确指定它,SQL Serve 将不会复制它——>没有空间被浪费。 -
我同意 VARCHAR(64) 的事情。在这一点上,对于我们的应用程序来说,这是一个遗留问题,实际上有一个半好的理由。所以现在很难改变。但在我们的应用程序的下一个版本中,我们计划切换到大整数或 guid。
-
如果您要切换 - 请不要切换到 GUID !再说一遍:Kimberly Tripp: GUIDs as PRIMARY KEYs and/or the clustering key - GUID 对于集群键来说是非常糟糕。避开他们。说真的。
标签: sql sql-server tsql indexing ddl