【发布时间】:2016-06-21 19:22:49
【问题描述】:
我有一个 Oracle 视图(使用 11gR2),它是其他三个视图的连接,即:
create or replace view main_vw as
select a.*, b.*, c.*
from a_vw a, b_vw b, c_vw c
where a.b_id = b.b_id
and a.c_id = c.c_id
执行“select * from main_vw”会挂几个小时,而 EXPLAIN PLAN 显示了一个非常低效的查询计划。但是,如果创建逻辑上等效的步骤:
create table a_tbl as select * from a_vw;
create table b_tbl as select * from b_vw;
create table c_tbl as select * from c_vw;
select a.*, b.*, c.*
from a_tbl a, b_tbl b, c_tbl c
where a.b_id = b.b_id and a.c_id = c.c_id;
所有四个语句在 5 秒内完成。
有什么方法可以使用提示或其他东西让 Oracle 的优化器首先评估子视图,然后像表格一样加入它们?
我查看了提示“QB_NAME”、“NO_EXPAND”、“NO_REWRITE”,但无济于事......
注意:本例中的 a_vw、b_vw 和 c_vw 是相当复杂的查询,它们共同引用基表。它们还引用了一个设置表,其内容在会话级别进行自定义并影响返回的内容。因此,我无法从这些视图创建表。
【问题讨论】:
标签: oracle plsql oracle11g query-optimization