代码之家  ›  专栏  ›  技术社区  ›  Jude Allred

覆盖指数是否安全地取代较小的覆盖指数?

  •  1
  • Jude Allred  · 技术社区  · 17 年前

    例如:

    Given columns A,B,C,D,
    
    IX_A is an index on 'A'
    
    IX_AB is a covering index on 'AB'
    

    ix_a可以安全移除,因为它是多余的:ix_ab将在其位置使用。 我想知道这是否概括了:

    如果我有:

    IX_AB
    IX_ABC
    IX_ABCD
    

    等等,

    较小的指数还能被安全删除吗? 也就是说,ix_abc是否使ix_ab冗余,而ix_abc是否使ix_ab和ix_abc都冗余?

    5 回复  |  直到 17 年前
        1
  •  3
  •   Randolpho    17 年前

    一般来说,覆盖索引将覆盖较小的索引选择,这在服务器之间有所不同。

    所以如果你有一个覆盖A,B,C的索引,它通常会自动给你一个覆盖A,和A,B的索引。

    例如,你不能保证有B,C的覆盖指数。

        2
  •  2
  •   richardtallent    17 年前

    是的,大部分情况下。

    但是,作为替代,比如说,ix-bcd并没有太大的帮助。

    但是,有一个警告:索引仍然可能需要磁盘读取,因此如果C和D分解索引的大小,那么在ix-a b中查找a、b会有一些效率低下,在ix-a b中查找时不会出现这种情况。

    然而,这种差异可能会被单独维护ix_ab带来的额外性能冲击所抵消。

        3
  •  1
  •   Logicalmind    17 年前

    重要的是索引中的前导列。如果您有索引ix_,以下查询将使用该索引:

    从表中选择*,其中a=1

    从表中选择*,其中a=1和b=1

    从表中选择*,其中a=1,b=1,c=1

    但是,以下内容很可能不会使用索引(至少不会按预期方式使用):

    从表中选择*,其中b=1

    从表中选择*,其中c=1

    从表中选择*,其中b=1和c=1

    重要的是使用了前导列。因此,创建索引时列的顺序很重要。

        4
  •  0
  •   Remus Rusanu    17 年前

    不一定。虽然(a、b、c)上的索引可以用于a上的筛选谓词或a上的排序请求或a上的联接条件,但这并不一定意味着仅索引(a)是无用的。如果(a,b,c)上的指数相当大 更广的 与(a)相比,单独在上进行范围扫描将节省大量的I/O,因为它必须读取更少的页面(索引更窄)。

    但我认为这将是例外而不是规则。一般来说,如果(a,b)上存在另一个索引,则可以安全地删除a上的索引。请注意,(a,b)上的索引不满足对b的任何筛选,因此,只有在最左边的列相同的情况下才可以安全地删除。有些数据库有“跳过扫描”运算符,可以使用(a,b)上的索引查找b,但这是一个非常窄的边界情况。

        5
  •  0
  •   Trevor Tippins    17 年前

    最好不要假设任何关于数据库引擎内部的事情,并实际检查正在使用的实际查询计划。

    推荐文章