我想在Column1和Column2中的SQL Server 2008 R2中创建索引 以下查询有什么区别:
不包括
CREATE NONCLUSTERED INDEX [IX_1] ON [dbo].[MyTable]
(
[Column1] ASC,
[Column2] ASC
) ON [PRIMARY]
或者包括:
CREATE NONCLUSTERED INDEX [IX_2] ON [dbo].[MyTable]
(
[Column1] ASC
)
INCLUDE ([Column2]) ON [PRIMARY]
答案 0 :(得分:25)
在第一个Column2
中添加到索引键。在第二个中,它可能不会将(*)添加到键中,在这种情况下它只会出现在索引叶页中。这可以允许Column1
搜索索引,但是无需返回基表(bookmark lookup/key lookup)来检索Column2
的值。
即。它使index2“覆盖”了诸如
之类的查询SELECT Column1,Column2
FROM [dbo].[MyTable]
WHERE Column1 = 'X'
它还包括诸如
之类的查询SELECT Column1,Column2
FROM [dbo].[MyTable]
WHERE Column1 = 'X' AND Column2 = 'Y'
但是index1可能对第二个查询表现得更好,因为它可以直接在两列上搜索(而不是只能搜索Column1
然后需要在索引叶级别评估所有匹配的行看看它们是否符合Column2
谓词)。如果Column2
从未用作针对该索引的搜索谓词,并且针对该索引的查询不会因订购Column2
而受益,则应将其添加为INCLUDE
- d列保持键的大小,减少索引中的页数。
(*)我上面说“可能没有”的原因是因为如果Column2
是聚合索引键的一部分,那么will still be added there anyway表示非聚集索引,而不是使用UNIQUE
选项。