標籤:
最近在研究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%的提升,帥翻了~~~
感謝 小楓 的大力協助啊~~~~
oracle 初試 hint