2009-01-07 45 views
15

我試圖優化查詢性能,並不得不求助於使用優化器提示。但是我從來沒有學過優化器是否會一次使用多個提示。Oracle優化器會在同一個SELECT中使用多個提示嗎?

例如

SELECT /*+ INDEX(i dcf_vol_prospect_ids_idx)*/ 
     /*+ LEADING(i vol) */ 
     /*+ ALL_ROWS */ 
     i.id_number, 
     ... 
    FROM i_table i 
    JOIN vol_table vol on vol.id_number = i.id_number 
    JOIN to_a_bunch_of_other_tables... 
WHERE i.solicitor_id = '123' 
    AND vol.solicitable_ind = 1; 

解釋計劃顯示相同的成本,但我知道這只是一個估計。

請假定所有表格和索引統計都已經計算完畢。僅供參考,索引dcf_vol_prospect_ids_idx位於i.solicitor_id列中。

謝謝,

回答

19

嘗試在單個註釋塊指定所有的提示,如圖從妙Oracle文檔(http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/hintsref.htm)這個例子。

16.2.1指定全套提示

的使用提示,在某些情況下,你 可能需要以確保最佳的 執行計劃指定的全套 提示。例如,如果您 有一個非常複雜的查詢,其中 包括很多表連接,如果 只指定了 給定表的索引提示,則優化需要 確定剩餘訪問 路徑使用,以及相應的連接方法 。因此, 即使你給了INDEX提示, 優化不一定 使用該提示,因爲優化 可能已經確定 請求的索引無法使用,由於 由所選擇的連接方法和訪問路徑 優化。

在示例16-1中,領導提示 指定使用的確切連接順序爲 ;在 上使用的連接方法的不同表格也是 指定的。

例16-1指定的 提示

SELECT /*+ LEADING(e2 e1) USE_NL(e1) INDEX(e1 emp_emp_id_pk) 
      USE_MERGE(j) FULL(j) */ 
    e1.first_name, e1.last_name, j.job_id, sum(e2.salary) total_sal 
FROM employees e1, employees e2, job_history j 
WHERE e1.employee_id = e2.manager_id 
    AND e1.employee_id = j.employee_id 
    AND e1.hire_date = j.start_date 
GROUP BY e1.first_name, e1.last_name, j.job_id ORDER BY total_sal; 
+0

如果有人在乎,我試過這個,解釋計劃給出了和以前一樣的成本。誰知道CBO是否會真正使用它! : -/ – 2009-01-07 20:57:41

+0

Dave, 我確信RTFMed這一章,但從未偶然發現過這個偉大的例子。對於愚蠢的帖子感到抱歉;我真的不想這麼做!: -/ 感謝, 燉 – 2009-01-07 20:58:20

2

事實上全套,喬納森·劉易斯,基於成本的Oracle基礎的作者的建議是,如果失敗,CBO在找到正確的計劃中,您需要接管CBO的工作並「提示」提示 - 查詢中每個表的平均兩個提示。

原因是,一個提示可能會導致另一個糟糕的計劃,甚至可能比CBO得不到幫助。如果CBO是錯誤的,則需要將整個計劃給予它,而不僅僅是朝正確的方向推動。

相關問題