使用Oracle Hint提示來更改執行計劃

tolywang發表於2007-11-26
由於每一版本的最佳化器都變得更為完善,Oracle 為更改您的 SQL 執行計劃提供了不斷增多的方法。Oracle 提示的最常見用處是作為除錯工具。您可以使用提示來確定最優的執行計劃,然後向回執行,調節統計量,使調整後的 SQL 模擬所提示的查詢。

使用 Oracle 提示可能非常複雜,而 Oracle 開發人員只是將提示用作最後的手段,首先應改變統計量來更改執行計劃。Oracle 包含 124 種以上的提示,其中許多提示在 Oracle 文件中找不到。(參見

讓我們快速瀏覽如何使用提示來改變最佳化器執行計劃:最佳化器提示是放置在 SQL 語句的註釋內的最佳化器指示,用於那些不常出現的情況,即最佳化器作出了關於執行計劃的不正確決策。由於提示處於註釋內,因此確保提示名稱拼寫正確並確保提示適用於該查詢十分重要。

例如,以下提示是無效的,因為 first_rows 訪問與並行訪問相互排斥。這是因為 parallel 始終假定進行全表掃描,而 first_rows 支援進行索引訪問。

-- An invalid hint
select /*+ first_rows parallel(emp,8)*/ 
   emp_name 
from 
   emp 
order by 
   ename;

某些 Oracle 專業人員會將提示集合在一起,以強化他們的期望。例如,如果我們有一臺具有八個或更多 CPU 的 SMP 伺服器,則我們可能希望使用 Oracle 並行查詢來加速合法的全表掃描。在使用並行查詢時,我們很少會希望在表一級啟用並行機制 (alter table customer parallel 35;),因為表的並行機制設定會影響最佳化器,導致最佳化器認為全表掃描的代價並不高。因此,多數 Oracle 專業人員在逐個查詢的基礎上指定並行查詢,將完全提示與 parallel 提示聯合使用,以確保快速的並行全表掃描:

-- A valid hint
select /*+ full parallel(emp,35)*/ 
   emp_name 
from 
   emp 
order by 
   ename;

既然我們已經瞭解了提示的一般性概念,就讓我們來觀察最佳化器調整最重要的提示之一。

ordered 提示確定查詢執行的驅動表,還指定將表聯接在一起的順序。ordered 提示要求表應該以它們在 from 子句中所指定的順序進行聯接,from 子句中的第一個表指定為驅動表。使用 ordered 提示可以節省大量的分析時間,並加速 SQL 的執行,因為您告訴最佳化器聯接表的最佳順序。

例如,以下查詢使用排序提示,將表以它們在 from 子句中指定的順序聯接起來。在該示例中,我們透過指定 emp 到 dept 的聯接使用雜湊聯接,sal 到 bonus 的聯接使用巢狀迴圈聯接,進一步改進了執行計劃:

select 
/*+ ordered use_hash (emp, dept) use_nl (sal, bon) */
from
   emp,
   dept,
   sal,
   bon
where . . .

當然,ordered 提示最常用於資料倉儲查詢或聯接超過五個表的 SQL 中。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-85052/,如需轉載,請註明出處,否則將追究法律責任。

相關文章