gpt4 book ai didi

sql - 使用include列和不使用include列创建索引的区别

转载 作者:行者123 更新时间:2023-12-02 01:26:33 26 4
gpt4 key购买 nike

我想在 SQL Server 2008 R2 中的 Column1 和 Column2 中创建索引以下查询有什么区别:

  1. 不包括

    CREATE NONCLUSTERED INDEX [IX_1] ON [dbo].[MyTable] 
    (
    [Column1] ASC,
    [Column2] ASC
    ) ON [PRIMARY]
  2. 或者包括:

    CREATE NONCLUSTERED INDEX [IX_2] ON [dbo].[MyTable] 
    (
    [Column1] ASC
    )
    INCLUDE ([Column2]) ON [PRIMARY]

最佳答案

在第一个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 选项创建的非聚集索引。

关于sql - 使用include列和不使用include列创建索引的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10828568/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com