索引和NOT,OR,AND运算符

时间:2014-02-28 05:29:08

标签: oracle indexing

我无法直截了当地回答这个问题。我的数据库中的列对colA,colB,colC具有良好的选择性。他们在单桌。这些列还包含NULL值。 我尝试建立NORMAL索引。但查询执行速度并不快。我想因为运算符NOT,没有使用索引。

问题: 请确认索引是否将在以下方案中使用。 我知道colB<> 'b1'不会使用索引。另外,我不是在问我强制使用索引会发生什么。我不能,因为我的产品在后端构建了我无法控制的查询。

  1. NOT(colA ='a1')
  2. NOT(colA ='a1'OR colA ='a2')
  3. NOT(colA ='a1'OR colA ='a2'AND colC ='c1')
  4. NOT(colA ='a1'或colA ='a2'或colC ='c1')

  5. colB ='b1'OR colB不为空

  6. colB ='b1'OR colB为空
  7. colB<> 'b1'OR colB不为空
  8. colB<> 'b1'OR colB为空

2 个答案:

答案 0 :(得分:1)

在这些情况下,普通索引通常不会有用,但可能会使用Bitmap索引:

  1. NOT(colA ='a1')
  2. NOT(colA ='a1'OR colA ='a2')
  3. NOT(colA ='a1'OR colA ='a2'AND colC ='c1')
  4. NOT(colA ='a1'或colA ='a2'OR colC ='c1')
  5. 在这种情况下,我怀疑Oracle会选择使用哪一个索引:

    1. colB ='b1'OR colB不为空
    2. 在这种情况下,由于NULL谓词,colB上的普通索引根本不可用:

      1. colB ='b1'OR colB为空
      2. 在这些情况下,我怀疑Oracle会选择使用这两种索引:

        1. colB<> 'b1'OR colB不为空
        2. colB<> 'b1'OR colB为空
        3. 在所有情况下,它都是不确定的,因为存在边缘情况(例如,具有某些数据模式),CBO可以很好地选择索引 - 例如当数据高度倾斜并且已经采用直方图时,或者使用动态采样时。

          另请注意,结果可能会有所不同,具体取决于您是使用文字值(如示例中所示)还是绑定变量。

答案 1 :(得分:0)

对于NOT (A='a')A<>'a'情况,将使用TABLE FULL SCAN

对于IS NOT NULL个案例,将在列索引存在的地方使用FULL INDEX SCAN

对于IS NULL个案例,不会使用列索引(NULL值未被索引),在这种情况下,基于函数的索引可以创建为IS_NULL(column),其中IS_NULL是确定性的函数返回例如1表示NULL值,NULL表示NOT NULL值。在查询中,您必须使用IS_NULL(column) IS NOT NULL而不是column IS NULL来使用此基于函数的索引(FULL INDEX SCAN)