我无法直截了当地回答这个问题。我的数据库中的列对colA,colB,colC具有良好的选择性。他们在单桌。这些列还包含NULL值。 我尝试建立NORMAL索引。但查询执行速度并不快。我想因为运算符NOT,没有使用索引。
问题: 请确认索引是否将在以下方案中使用。 我知道colB<> 'b1'不会使用索引。另外,我不是在问我强制使用索引会发生什么。我不能,因为我的产品在后端构建了我无法控制的查询。
NOT(colA ='a1'或colA ='a2'或colC ='c1')
colB ='b1'OR colB不为空
答案 0 :(得分:1)
在这些情况下,普通索引通常不会有用,但可能会使用Bitmap索引:
在这种情况下,我怀疑Oracle会选择使用哪一个索引:
在这种情况下,由于NULL谓词,colB上的普通索引根本不可用:
在这些情况下,我怀疑Oracle会选择使用这两种索引:
在所有情况下,它都是不确定的,因为存在边缘情况(例如,具有某些数据模式),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)