Oracle提高SQL執行效率的三種方法

2021-09-09 08:54:04 字數 2674 閱讀 4343

要提高sql在oracle裡的執行效率,優化應用的業務邏輯是最主要的,從技術層面來講oracle也提供了一些方法,今天主要講3種:

oracle提供了多種方法用於減少花在剖析oraclesql表示式上的時間,在執行帶有大量執行計畫的複雜查詢時剖析過程會拖累系統的效能。現在我們來簡要地看看這些方法中的幾種。

1、使用ordered提示

oracle必須花費大量的時間來剖析多表的合併,用以確定表合併的最佳順序。如果sql表示式涉及七個乃至更多的表合併,那麼有時就會需要超過30分鐘的時間來剖析,因為oracle必須評估表合併所有可能的順序。八個表就會有40,000多種順序。ordered這個提示(hint)和其他的提示一起使用能夠產生合適的合併順序。

ordered這個提示會要求列在sql表示式from字句裡的表按照指定的順序進行合併,from字句裡的第乙個表會指定驅動**(drivingtable)。驅動**應該是返回最小行數的**。使用ordered提示會跳過非常耗時和耗資源的剖析操作,並加快oracle sql的執行。

listing a如下:

以下是引用片段:

listing a

select /*+ ordered use_nl(b) parallel(e, 4) */ e.ename, hiredate, b.comm

from emp e,bonus b

where e.ename = b.ename ;

listinga裡是乙個複雜查詢的例子,這個查詢被強制進行乙個巢狀迴圈,從而與對emp**進行的並行查詢合併。要注意,我已經使用ordered提示來引導oracle去按照from子句所列出的順序來評估**。

2、使用ordered_predicates

ordered_predicates提示在查詢的where子句裡指定的,並被用來指定布林判斷(booleanpredicate)被評估的順序。在沒有ordered_predicates的情況下,oracle會使用下面這些步驟來評估sql判斷的順序:

子查詢的評估先於外層where子句裡的boolean條件。

所有沒有內建函式或者子查詢的布林條件都按照其在where子句裡相反的順序進行評估,即最後一條判斷最先被評估。

每個判斷都帶有內建函式的布林判斷都依據其預計的評估值按遞增排列。

create table t1(v1,n1,n2) as select to_char(mod(rownum,20)),rownum,mod(rownum,20) from all_objects where rownum<=3000;

sql> execute dbms_stats.gather_table_stats('hr','t1');

sql> select

2 v1,n2,n1

3 from t1

4 where v1=1

5 and n2=18

6 and n1=998

7 ;no rows selected

execution plan

plan hash value: 3617692013

| id | operation | name | rows | bytes | cost (%cpu)| time |

| 0 | select statement | | 1 | 10 | 4 (0)| 00:00:01 |

|* 1 | table access full| t1 | 1 | 10 | 4 (0)| 00:00:01 |

predicate information (identified by operation id):

1 - filter("n1"=998 and "n2"=18 and to_number("v1")=1)

sql> select /*+ ordered_predicates */

2 v1,n2,n1

3 from t1

4 where v1=1

5 and n2=18

6 and n1=998

7 ;no rows selected

execution plan

plan hash value: 3617692013

| id | operation | name | rows | bytes | cost (%cpu)| time |

| 0 | select statement | | 1 | 48 | 4 (0)| 00:00:01 |

|* 1 | table access full| t1 | 1 | 48 | 4 (0)| 00:00:01 |

predicate information (identified by operation id):

1 - filter(to_number("v1")=1 and "n2"=18 and "n1"=998)

3、限制**合併評估的數量

提高sql剖析效能的最後一種方法是強制取代oracle的乙個引數,這個引數控制著在評估乙個查詢的時候,基於消耗的優化器所評估的可能合併數量。

_optimizer_search_limit這個引數會指定**合併組合的最大數量,後者將會在oracle試圖確定合併多**最佳方式的時候被評估。這個引數有助於防止優化器花更多的時間來評估可能的合併順序,而不是把時間花在尋找最佳合併順序上。_optimizer_search_limit還控制著用於呼叫starjoin提示的闕值,當查詢裡的**數量低於_optimizer_search_limit(其預設的值是5)的時候,star提示就會被光顧。

Oracle提高sql執行效率的心得建議

複製 如下 from子句中包含多個表的情況下,選擇記錄條數最少的表作為基礎表 解析where子句是自下而上的 過濾條件要有順序 oracle會將 轉換成列名 delete會在rollback segment中存放可恢復資訊,可以試試truncate commit會釋放 1.rollback segm...

提高SQL執行效率的方法

oracle提供了多種方法用於減少花在剖析oracle sql表示式上的時間,在執行帶有大量執行計畫的複雜查詢時剖析過程會拖累系統的效能。現在我們來簡要地看看這些方法中的幾種。1 使用ordered提示 oracle必須花費大量的時間來剖析多 的合併,用以確定 合併的最佳順序。如果sql表示式涉及七...

提高SQL效率

下面就某些sql 語句的 where 子句編寫中需要注意的問題作詳細介紹。在這些 where 子句中,即使某些列存在索引,但是由於編寫了劣質的 sql 系統在執行該 sql 語句時也不能使用該索引,而同樣使用全表掃瞄,這就造成了響應速度的極大降低。1.is null 與 is not null 不能...