最近在研究oracle的视图问题,本来想全转成 物化视图(materialized view)的,这样可以极大提升系统的响应时间,无奈工作量太大,所以就研究了SQL优化的问题。
我这个普通视图 有360行,其中还有left join 了多个别的视图,这些个视图也有300+行。
所以在朋友指导下,尝试了一下HINT。
步骤1 :
查出这个视图的SQL_ID :
select sql_id from v$sql where sql_text like ‘%你中间关键语句%‘
步骤2 :
select * from table(dbms_xplan.display_cursor(sql_id => ‘12ynt5upntqm7‘,cursor_child_no => 0,format => ‘advanced‘));
执行结果如下 :
Outline Data
-------------
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
/*+
BEGIN_OUTLINE_DATA
IGNORE_OPTIM_EMBEDDED_HINTS
OPTIMIZER_FEATURES_ENABLE(‘11.2.0.4‘)
DB_VERSION(‘11.2.0.4‘)
ALL_ROWS
OUTLINE_LEAF(@"SEL$88122447")
MERGE(@"SEL$641071AC")
OUTLINE(@"SEL$1")
OUTLINE(@"SEL$641071AC")
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
MERGE(@"SEL$07BDC5B4")
OUTLINE(@"SEL$2")
OUTLINE(@"SEL$07BDC5B4")
MERGE(@"SEL$4")
OUTLINE(@"SEL$3")
OUTLINE(@"SEL$4")
FULL(@"SEL$88122447" "X$KGLCURSOR_CHILD"@"SEL$4")
END_OUTLINE_DATA
*/
Predicate Information (identified by operation id):
把中间这一坨 放到之前视图对应SQL 的最前面,例如 :
SELECT
/*+
BEGIN_OUTLINE_DATA
IGNORE_OPTIM_EMBEDDED_HINTS
OPTIMIZER_FEATURES_ENABLE(‘11.2.0.4‘)
DB_VERSION(‘11.2.0.4‘)
ALL_ROWS
OUTLINE_LEAF(@"SEL$88122447")
MERGE(@"SEL$641071AC")
OUTLINE(@"SEL$1")
OUTLINE(@"SEL$641071AC")
MERGE(@"SEL$07BDC5B4")
OUTLINE(@"SEL$2")
OUTLINE(@"SEL$07BDC5B4")
MERGE(@"SEL$4")
OUTLINE(@"SEL$3")
OUTLINE(@"SEL$4")
FULL(@"SEL$88122447" "X$KGLCURSOR_CHILD"@"SEL$4")
END_OUTLINE_DATA
*/
DISTINCT part11.ccp from 啪啦啪啦啪啪啪
速度从 1.9秒 提升到1秒。
50%的提升,帅翻了~~~
感谢 小枫 的大力帮助啊~~~~