【问题标题】:Difference of create Index by using include column or not using使用包含列或不使用创建索引的区别
【发布时间】:2012-06-05 09:55:05
【问题描述】:
我想在 SQL Server 2008 R2 的 Column1 和 Column2 中创建索引
以下查询有什么区别:
-
不包括
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]
【问题讨论】:
标签:
sql
sql-server
tsql
indexing
sql-server-2008-r2
【解决方案1】:
在第一个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 选项创建的非聚集索引.