我们有Oracle 10g,我们需要查询1个表(无联接)并过滤出其中1列为空的行。当我们这样做时-WHERE OurColumn不为空-我们在非常大的表-BAD BAD BAD上进行了全表扫描。该列上有一个索引,但是在这种情况下将被忽略。有什么解决办法吗?
谢谢
最佳答案
优化器认为全表扫描会更好。
如果只有几行NULL
,则说明优化程序是正确的。
如果您完全确定索引访问会更快(也就是说,使用75%
的行超过col1 IS NULL
行),则提示您查询:
SELECT /*+ INDEX (t index_name_on_col1) */
*
FROM mytable t
WHERE col1 IS NOT NULL
为什么
75%
?因为使用
INDEX SCAN
检索索引未涵盖的值意味着对ROWID
进行了隐藏连接,其成本约为表扫描的4
倍。如果索引范围包含多于
25%
行,则表扫描通常会更快。如
Tony Andrews
所述,聚类因子是测量此值的更准确方法,但是25%
仍然是一个很好的经验法则。
关于oracle - Oracle 10g-优化WHERE IS NOT NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/721556/