如何将低/高基数列配对为复合索引?

时间:2017-01-18 18:33:31

标签: oracle11g database-performance

这个问题与Oracle DB有关,所以如果有一般答案我想知道。因为我正在丢弃有关此主题的Derby / MySQL和其他DB的信息。

假设我在其WHERE子句中使用以下列有几个查询:

Column | Cardinality | Selectivity
_______|__________________________
A      | low         | low
B      | high        | low
C      | low         | low
D      | high        | high
E      | low         | low
F      | low         | low
-- Queries
SELECT * FROM T WHERE A:=? AND B:=? 
SELECT * FROM T WHERE A:=? AND B:=? AND C:=?
SELECT * FROM T WHERE A:=? AND C:=?
SELECT * FROM T WHERE A:=? AND C:=? AND D:=?
SELECT * FROM T WHERE A:=? AND E:=? AND F:=?
  1. 这些列(考虑基数混合)配对作为复合索引有什么好处?如果是这样,那么遵循什么逻辑呢? 我理解this explanation但它适用于SQL Server,它可能表现不同。

  2. 是否值得覆盖索引而不是单个小型复合索引?

  3. 复合索引的列顺序是否重要?即:

  4. -- Regardless the column order on the table creation.
    CREATE INDEX NDX_1 ON T (A, C);
    -- Versus:
    CREATE INDEX NDX_1 ON T (C, A);
    
    1. 这个索引会有用吗?
    2. CREATE INDEX NDX_2 ON T(E, F); -- (low + low) Ignoring 'A' column.
      

2 个答案:

答案 0 :(得分:2)

有些事情并牢记这些是一般性

  • 通常,您只能使用索引的前导部分。所以看 在你的例子

    如果你有一个索引(A,B,C),你有一个关于A和的谓词 C,那么只能使用A上的索引。现在有一些情况 可以使用索引的非前导部分;你会看见 这在执行计划中作为SKIP-SCAN操作,但它们是 通常是次优的。所以可能希望拥有(A,C)和(C,A)

  • 如果您不投影索引以外的列,则覆盖索引可能很有用。

  • 通常,如果列的选择性较低,通常不需要或不需要索引。但是,您可能有两个单独具有低选择性的色谱柱,但在组合使用时具有高选择性。 (实际上,这是维度模型中位图索引/星形变换的前提)。

  • 如果多列索引很有用,您可能希望首先选择具有最低选择性的列并启用索引压缩。索引压缩在某些情况下可以节省大量空间,并且CPU开销很小。

最后,SQL Monitor报告将帮助您在运行时优化sql语句。

答案 1 :(得分:1)

最佳数量索引以最佳方式处理所有5种情况:

(A, B, C)  -- in exactly this order
(A, C, D)  -- in exactly this order
(A, E, F)  -- in any order

如果您添加其他SELECT,则所有投注均已关闭。

何时拥有(A, C) (C, A)?...

  • 每个处理仅使用第一列的情况。
  • 前者最适合WHERE A=1 AND C>5;后者不是。 (等)注:=与某种"范围"测试事宜。

在为表设计索引时,首先写出所有查询。