meh*_*tfi 21 sql t-sql sql-server indexing sql-server-2008-r2
我想在Column1和Column2中的SQL Server 2008 R2中创建索引以下查询的区别是什么:
不包括
CREATE NONCLUSTERED INDEX [IX_1] ON [dbo].[MyTable]
(
[Column1] ASC,
[Column2] ASC
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)或包括:
CREATE NONCLUSTERED INDEX [IX_2] ON [dbo].[MyTable]
(
[Column1] ASC
)
INCLUDE ([Column2]) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)Mar*_*ith 25
在第一个中Column2
添加到索引键.在第二个中,它可能不会(*)被添加到键中,在这种情况下它只会出现在索引叶页中.这可以允许搜索索引,Column1
但是避免需要返回基表(书签查找/键查找)来检索值Column2
.
即它使index2"覆盖"查询,如
SELECT Column1,Column2
FROM [dbo].[MyTable]
WHERE Column1 = 'X'
Run Code Online (Sandbox Code Playgroud)
它还包括诸如的查询
SELECT Column1,Column2
FROM [dbo].[MyTable]
WHERE Column1 = 'X' AND Column2 = 'Y'
Run Code Online (Sandbox Code Playgroud)
但是index1可能对第二个查询执行得更好,因为它可以直接在两列上进行搜索(而不是只能搜索Column1
然后需要在索引叶级别评估所有匹配的行以查看它们是否符合Column2
谓词).如果Column2
从未用作针对该索引的搜索谓词,并且您对该索引的查询不会从Column2
订购中受益,则应将其添加为INCLUDE
-d列以保持密钥的大小并减少该页面中的页数指数.
(*)我上面说"可能没有"的原因是因为如果Column2
是(聚合索引键)的一部分,它仍将被添加到那里,无论如何,对于不使用该UNIQUE
选项创建的非聚簇索引.