代码之家  ›  专栏  ›  技术社区  ›  IamIC

SQL Server中覆盖与单索引的重叠

  •  3
  • IamIC  · 技术社区  · 14 年前

    我有一个关于SQL Server中索引的最佳实践(或者任何RDBMS)的问题。下表:

    ProfileID int
    Text      nvarchar(50)
    

    ProfileID 连接到 Profile 桌子。对于每个配置文件,每个 Text 必须是唯一的。因此,我在两个列上都放了一个主封面键。好的。

    但是,我也希望能够通过 文件标识符 . 所以我也把索引放在 文件标识符 我也是。

    这意味着我有一个重叠索引。我不知道这是完全浪费,因为已经有一个封面索引,或者它是正确的,因为封面索引将是两列的散列(或我误解封面索引)?

    编辑:

    我按顺序创建了索引 (ProfileID, Text) . 如果为了参数起见,有3列A、B和C,它们的封面索引覆盖了所有3列。只有当我们询问“A”或“A、B和C”,而不是“B”、“C”或“B和C”时,它才会受益吗?

    1 回复  |  直到 14 年前
        1
  •  5
  •   Quassnoi    14 年前

    索引 (ProfileID, Text) (按此顺序)是 ProfileID 也。

    您可能仍然希望在 文件标识符 只是,如果你想要更大的 SELECT 对不涉及的查询的性能 Text .

    然而,这有两个缺点:

    1. 维护两个索引需要更多的资源和性能 DML 查询( INSERT , UPDATE , DELETE )可能会受苦

    2. 如果混合使用这两种类型的查询,则两个索引都将占用缓存,并且与单个索引相比,可能会有更多的缓存未命中。

      如果您的表足够小,可以与两个索引一起放入缓存中,则这不是问题。

    封面索引将是两列的散列(或者我误解了封面索引)?

    一个真正的覆盖指数是这样创建的:

    CREATE INDEX ix_mytable_profile__text ON mytable (ProfileID) INCLUDE (Text)
    

    这种方式, 只存储在索引的叶级节点中。

    但是,既然你需要 UNIQUE 索引,两列都必须是键的一部分。节点按字典顺序排序。 文件标识符 然后 文本 .

    我按顺序创建了索引(ProfileID,Text)。如果为了参数起见,有3列A、B和C,它们的封面索引覆盖了所有3列。只有当我们询问“A”或“A、B和C”,而不是“B”、“C”或“B和C”时,它才会受益吗?

    CREATE INDEX ix_mytable_a_b_c ON mytable (a, b, c)
    
    SELECT  a, b, с
    FROM    mytable
    WHERE   a = 1 
    
    -- Index lookup, no table lookup. a is leading
    
    SELECT  a, b, с
    FROM    mytable
    WHERE   a = 1
            AND b = 1
    
    -- Index lookup, no table lookup. (a, b) are leading.
    
    SELECT  a, b, с
    FROM    mytable
    WHERE   b = 1
    
    -- Index full scan (`b` is not leading), no table lookup
    
    SELECT  a, b, с
    FROM    mytable
    WHERE   c = 1
    
    -- Index full scan (`c` is not leading), no table lookup
    
    SELECT  a, b, с, d
    FROM    mytable
    WHERE   a = 1
    
    -- Index lookup, table tookup (d is not a part of the index).
    
    SELECT  a, b, с, d
    FROM    mytable
    WHERE   b = 1
    
    -- Table full scan (there is no point in using index at all, neither for lookup nor for covering).