Oracle的優化器有兩種優化方式 二

2021-06-29 11:22:38 字數 4968 閱讀 7530

15./*+use_concat*/

對查詢中的where後面的or條件進行轉換為union  all的組合查詢. (懵懂啊,先存著)

例如: 

select /*+use_concat */ * from emp where deptno=10 or empno=7788;

execution plan

0      select statement optimizer=choose (cost=2 card=2 bytes=174)

1    0   table access (full) of 'emp' (cost=2 card=2 bytes=174)

16./*+no_expand*/

對於where後面的or 或者in-list的查詢語句,

no_expand將阻止其基於優化器對其進行擴充套件.

select /*+no_expand*/  *  from  emp  where deptno=10 and job='manager';

execution plan

0      select statement optimizer=choose (cost=2 card=1 bytes=87)

1    0   table access (full) of 'emp' (cost=2 card=1 bytes=87)

17./*+nowrite*/

禁止對查詢塊的查詢重寫操作. 

18./*+rewrite*/

可以將檢視作為引數. 

19./*+merge(table)*/

能夠對檢視的各個查詢進行相應的合併. 

20./*+no_merge(table)*/

對於有可合併的檢視不再合併. 

21./*+ordered*/

根據表出現在from中的順序,ordered使oracle依此順序對其連線.

select  /*+ordered*/  d.dname, e.ename,e.sal from emp

e,dept

d where e.deptno=d.deptno;

execution plan

0      select statement optimizer=choose (cost=5 card=82 bytes=4510)

1    0 hash join (cost=5 card=82 bytes=4510)

2    1     table access(full) of 'emp' (cost=2 card=82 bytes=2706)

3    1     table access(full) of 'dept' (cost=2 card=82 bytes=1804)

兌換下emp

和dept

的順序,得到

select  /*+ordered*/  d.dname, e.ename,e.sal from dept

d,emp

ewhere e.deptno=d.deptno;

execution plan

0      select statement optimizer=choose (cost=5 card=82 bytes=4510)

1    0   hash join (cost=5 card=82 bytes=4510)

2    1     table access (full) of 'dept' (cost=2 card=82 bytes=1804)

3    1     table access (full) of 'emp' (cost=2 card=82 bytes=2706)

對比下沒有使用強制

ordered

排列的情況的執行計畫

select d.dname, e.ename,e.sal from emp e,dept d where e.deptno=d.deptno;

execution plan

0      select statement optimizer=choose

1    0   nested loops

2    1     table access (full) of 'emp'

3    1     table access (by index rowid) of 'dept'

4    3       index (unique scan) of 'pk_dept' (unique)

22./*+use_nl(table)*/

將指定表與巢狀的連線的行源進行連線,並把指定表作為內部表.

select

/*+ordered use_nl(emp)*/

empno,dnamefromemp, deptwhereemp.deptno = dept.deptno;

execution plan

0      select statement optimizer=choose (cost=5 card=82 bytes=3936)

1    0   hash join (cost=5 card=82 bytes=3936)

2    1     table access (full) of 'emp' (cost=2 card=82 bytes=2132)

3    1     table access (full) of 'dept' (cost=2 card=82 bytes=1804 )

對比下使用

dept

作為內部表的執行計畫

(可以看到耗費的時間明顯增加)

select

/*+ordered use_nl(dept)*/

empno,dnamefromemp, deptwhereemp.deptno = dept.deptno;

execution plan

0      select statement optimizer=choose (cost=84 card=82 bytes=3936)

1    0   nested loops (cost=84 card=82 bytes=3936)

2    1     table access (full) of 'emp' (cost=2 card=82 bytes=2132)

3    1     table access (by index rowid) of 'dept' (cost=1 card=1 bytes=22)

4    3       index (unique scan) of 'pk_dept' (unique)

23./*+use_merge(table)*/

將指定的表與其他行源通過合併排序連線方式連線起來(可是執行計畫顯示的是hash join).

select  /*+use_merge(emp,dept)*/  e.ename, d.deptno,dname  from emp e, dept d

where e.deptno = d.deptno  order by e.deptno, d.deptno;

execution plan

0      select statement optimizer=choose (cost=7 card=82 bytes=3444)

1    0   sort (order by) (cost=7 card=82 bytes=3444)

2    1     hash join (cost=5 card=82 bytes=3444)

3    2       table access (full) of 'emp' (cost=2 card=82 bytes=1640)

4    2       table access (full) of 'dept' (cost=2 card=82 bytes=1804)

24./*+use_hash(table)*/

將指定的表與其他行源通過雜湊連線方式連線起來. 

select

/*+use_hash(emp,dept) */

empno ,dnamefromemp, deptwhereemp.deptno = dept.deptno;

execution plan

0      select statement optimizer=choose (cost=5 card=82 bytes=3936)

1    0   hash join (cost=5 card=82 bytes=3936)

2    1     table access (full) of 'emp' (cost=2 card=82 bytes=2132)

3    1     table access (full) of 'dept' (cost=2 card=82 bytes=1804)

25./*+driving_site(table)*/

強制與oracle所選擇的位置不同的表進行查詢執行. (

執行計畫看不出任何區別

,字面懵懂

)26./*+leading(table)*/

將指定的表作為連線次序中的首表. 

27./*+cache(table)*/

當進行全表掃瞄時,cache提示能夠將表的檢索塊放置在緩衝區快取中最近最少列表lru的最近使用端 

28./*+nocache(table)*/

兩種優化查詢的方法

兩種優化表查詢的方法 1 表的查詢順序 針對多表查詢 oracle的解析器按照從右到左的順序處理from子句中的表名,因此from子句中寫在最後的表 基礎表 driving table 將被最先處理。在from子句中包含多個表的情況下,你必須選擇記錄條數最少的表作為基礎表。當oracle處理多個表時...

Oracle執行有兩種方式

oracle資料有兩種方式 1 歸檔方式 archivelog 歸檔方式的目的在於當資料庫發生故障時最大限度恢復資料庫,保以保證不丟失任何已經提交的資料 2 不歸檔方 noarchivelog 只能恢復資料庫到最近的 點 冷備份或者邏輯備份 資料丟失是非常可能的。改變不歸檔方式為歸檔方式 切換資料的...

氣泡排序演算法的兩種優化

氣泡排序 三種實現,兩種優化 首先,我們先介紹bubblesort 就是氣泡排序,氣泡排序大家應該最熟悉不過了 氣泡排序演算法的運作如下 從後往前 1.比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。2.對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最...