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