OceanBase 與聯(lián)接順序相關(guān)的 Hint

2021-06-17 16:58 更新

LEADING Hint

?LEADING? Hint 指示優(yōu)化器在執(zhí)行計劃中使用指定的表集作為前綴,它可以用來指定表的聯(lián)接順序。這個 Hint 比 ?ORDERED? Hint 更通用。

以下是 ?LEADING Hint? 的語法:

/*+ LEADING ( [ @ queryblock ] tablespec [ tablespec ]...  ) */

?LEADING? Hint 為確保按照用戶指定的順序聯(lián)接表,所以會進行嚴(yán)格的檢查。如果發(fā)現(xiàn) Hint 指定的 ?table_name? 不存在,則 ?LEADING? Hint 失效。如果發(fā)現(xiàn) Hint 中存在重復(fù)表,則 ?LEADING? Hint 失效。如果在優(yōu)化器聯(lián)接期間,無法找到對應(yīng)的表,那么該表及后面的表指定的聯(lián)接順序失效,該表前面指定的順序依然有效。如果由于聯(lián)接圖中的依賴關(guān)系,無法首先按照指定的順序聯(lián)接指定的表,則 ?LEADIN?G Hint 失效。如果指定兩個或多個相互沖突的 ?LEADING? Hint,則 LEADING Hint 失效。如果您指定了 ?ORDERED? Hint,它將覆蓋所有的 ?LEADING? Hint。

示例如下:

SELECT /*+ LEADING(e j) */ *
    FROM employees e, departments d, job_history j
    WHERE e.department_id = d.department_id
      AND e.hire_date = j.start_date;

ORDERED Hint

?ORDERED? Hint 指示數(shù)據(jù)庫按照表在 ?FROM? 子句中出現(xiàn)的順序聯(lián)接表。建議使用 ?LEADING? Hint,它比 ?ORDERED? Hint 更通用。

以下是 ?ORDERED? Hint 的語法:

/*+ ORDERED */

當(dāng)您從需要聯(lián)接的SQL語句中省略 ?ORDERED? Hint 時,將由優(yōu)化器將選擇聯(lián)接表的順序。但是優(yōu)化器不知道從每個表中要選擇的行數(shù),此時您可以使用 ?ORDERED? Hint 來指定聯(lián)接順序。這樣使您能夠比優(yōu)化器更好地選擇內(nèi)部表和外部表。如果在指定該 ?ORDERED? Hint 后發(fā)生了改寫,那么就按照改寫后的語句中的 ?FROM? 子句的順序聯(lián)接表。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號