我有一个表
MyTable
大约有 400 000 行。 MyColumn
是用 NOT NULL 定义的 not。 但是 MyColumn
有一个 UNIQUE KEY 约束。
当我运行此查询时:
SELECT ... FROM MyTable WHERE MyColumn IS NULL
Oracle 执行表访问(完整)。我认为这是正常的,因为 MyColumn
上没有“NOT NULL”属性。
所以,我在
MyColumn
上加上了“NOT NULL”。
但是 Oracle 继续进行表访问(完整)。如果在列上设置 NOT NULL,Oracle 应该告诉自己没有查询要做,因为根据设计,该列不能为空。没有?
Oracle 不会仅仅因为索引可用就使用索引。决定使用索引还是全表扫描取决于索引是否合适以及统计数据是否表明它比全表扫描性能更高。
IS NULL
的谓词永远不会使用单列B树索引,因为NULL不存储在这样的索引中,因此不会找到您想要的行。 IS NOT NULL
can 的谓词使用索引,但通常不会这样做,因为它会匹配太多行,因此在全表扫描时会表现得更好。