全部產品
Search
文件中心

PolarDB:Leading Hint

更新時間:Jul 06, 2024

Leading Hint是一個能指定超過一個表的多表Hint,Leading Hint指導最佳化器先按照Leading Hint指定的部分表的順序進行Join,然後再將Join完成的表作為最先訪問的表與剩餘的其他表進行Join。

注意事項

  • 目前暫未支援在嵌套SQL語句中使用Leading Hint,請勿在子類語句中使用Leading Hint,否則會產生不可預期的結果。
  • 最佳化器在產生多表Join順序時,對於有串連條件的表,會盡量先嘗試與其有串連關係的表Join,如果這其中沒有可以執行路徑產生,才會去嘗試產生Cartesian Product。因此,在使用Leading Hint時,對於有Join條件的表,緊跟著的表應儘可能是與前表有相關Join條件的表。否則,最佳化器會因為無法產生執行路徑而忽略Leading Hint。

前提條件

PolarDB PostgreSQL版(相容Oracle)預設開啟支援Hints功能,可以執行以下命令開啟該功能:
set enable_hints = true;

文法

  • Hints注釋以/*+ 開始(*+之間不能有空格),以*/結束。
  • 提示句包括提示名和接下來括弧包含的參數,以空格作為分界。
  • 需要緊跟在SELECT、UPDATE、INSERT、MERGE或DELETE關鍵字之後使用。
  • 不區分Hints指令的大小寫,即指令大寫或小寫形式都能正常工作。
說明 出現以下情況時,會發生衝突,導致Leading Hint不生效。
  • 當指定的表因為依賴關係等原因無法按照指示的順序先進行Join時,會忽略掉Leading Hint。
  • 當同時存在兩個或多個Leading Hint時,會忽略掉所有的Leading Hint。
  • 當Ordered Hint與Leading Hint同時存在時,Ordered Hint會覆蓋掉所有Leading Hint。
  • 當指定的表名或者別名中含有'.'時,例如,"s.t",會忽略掉Leading Hint。
  • 沒有緊跟在SELECT,UPDATE,INSERT,MERGE或DELETE關鍵字之後,會忽略掉Leading Hint。

樣本

假設資料庫中存在四張表, 四張表的表名或者別名為a b c d,且任意兩表之間都可以進行串連。

  • 正確的文法
    樣本可能串連路徑
    /*+ leading(a) */(((a b) c) d), (((a b) d) c), (((a c) b) d), (((a c) d) b), (((a d) b) c), (((a c) c) b)
    /*+ leading(a b) */(((a b) c) d), (((a b) d) c)
    /*+ leading(a b c) */(((a b) c) d)
    /*+ leading(a b c d) */(((a b) c) d)
    說明 ((a b) c)表示a b c三張表的Join順序為a->b->c(c (a b))表示a b c三張表的Join順序為c->a->b
  • 錯誤的文法
    樣本如下所示:
    • /* + leading(a) */
    • /*+ leading(a b) leading(a b) */
    • /*+ leading(a b a) */
    • /*+ leading(a b) leading(a)*/
    • /*+ leading(a b) leading(c d) */
    • /*+ leading(a b e) */
    • *+ leading(a b) leading(a c) */
    • /*+ leading() */
    說明 資料庫中不存在表名或別名為e的表。