即使应用过滤器,Oracle表访问已满

时间:2017-02-24 07:09:45

标签: sql oracle

我正在尝试进行SQL优化。我在TOAD执行了解释计划以供下面的查询。

即使我为TABLE1应用了filer。它说 TABLE ACCESS FULL TBALE TABLE1

有人可以帮帮我吗。

表1 - 有2百万条记录 表2 - 有1百万条记录

TABLE1 - 当applyng过滤器说WHERE STATUS ='I' - 100条记录

列STATUS是索引列

SELECT * FROM 
TABLE1, TABLE2
WHERE 
TABLE1.STATUS = 'I'
AND TABLE1.ID = TABLE2.ID

执行计划:

operation =“SELECT STATEMENT”optimizer =“ALL_ROWS”cost =“69”cardinality =“1”bytes =“12”

operation =“NESTED LOOPS”cost =“69”cardinality =“484”bytes =“5,808”

operation =“TABLE ACCESS”option =“FULL”optimizer =“ANALYZED”object_name =“TABLE1”object_type =“TABLE”cost =“69”cardinality =“485”bytes =“3,880”

operation =“INDEX”option =“UNIQUE SCAN”optimizer =“ANALYZED”object_name =“ID_PK”object_type =“INDEX(UNIQUE)”search_columns =“1”cost =“0”cardinality =“1”bytes =“ 4"

使用ANSI时:

SELECT * FROM 
TABLE1 INNER JOIN TABLE2 USING (ID)
WHERE 
TABLE1.STATUS = 'I'
;

相同的费用和所有。

1 个答案:

答案 0 :(得分:1)

Oracle主要使用基于成本/的方法来决定应该使用哪种访问路径。 根据索引统计信息(不同值的数量,聚类因子等),预期成本可能高于全表扫描。 您可以查看这些预期费用,例如通过添加INDEX (table1, index1)提示。 这样,您还可以检查索引访问是否实际上改善了查询运行时。 请注意,优化器还依赖于其他输入,例如系统参数和工作负载统计信息 - 因此,您可能需要考虑这些以及理解此特定优化器决策。但我提到的指数统计数据应该是一个良好的开端。