我想在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]
在第一个中,Column2将其添加到索引键。在第二个中,它可能不会(*)添加到键中,在这种情况下,它只会出现在索引叶子页中。这可以允许搜索索引,Column1但避免了需要返回基表(书签查找/关键字查找)来检索的值Column2。
Column2
Column1
即,它使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列添加,以减小键的大小并减少索引中的页数。指数。
INCLUDE
(*)我在上面说“可能不”的原因是,如果它Column2是聚集索引键(的一部分),则仍将为未使用该UNIQUE选项创建的非聚集索引添加该索引键。
UNIQUE