在Oracle裡加快SQL執行的三種方法

2021-04-12 16:00:20 字數 1422 閱讀 4625

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

使用ordered提示

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

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

listing a如下:

listing a

select /*+ ordered use_nl(bonus)

parallel(e, 4) */ e.ename, hiredate, b.comm from emp e, bonus b

where e.ename = b.ename ;

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

使用theordered_predicates

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

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

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

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

限制**合併評估的數量

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

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

以上只是一些oracle dba用來優化oracle資料庫應用程式sql查詢的效能的一些小技巧。

Oracle批量執行SQL語句

1.在plsql之類的工具中把語句塊寫在begin end之間,如 begin insert into table values insert into table values insert into table values insert into table values end 記住在end...

Oracle批量執行SQL語句

1.在plsql之類的工具中把語句塊寫在begin end之間,如 begin insert into table values insert into table values insert into table values insert into table values end 記住在end...

ORACLE 動態執行SQL語句

oracle 動態sql oracle 動態sql有兩種寫法 用 dbms sql 或 execute immediate,建議使用後者。試驗步驟如下 1.ddl 和 dml ddl begin execute immediate drop table temp 1 execute immediat...