在 PostgreSQL 中要影響執行計畫,就是透過 PostgreSQL 的 GUC 參數,對 Query Planner 選用執行計畫優先順序影響。
而 PostgreSQL 企業版則提供直接影響 Query Plan 的工具 — Optimizer hints,能夠以用 Oracle 的 Optimizer Hints 工具的使用方式,去影響 Postgres Query Planner 的行為。
Optimizer hints 將 Postgres 裡面的可行的設置方式,對照成 「Oracle-Style」 的 Optimizer Hint,直接對執行計畫進行動作的開關。如果 Query Planner 對於所指令的 Hint 找不到符合的執行計畫,這個 Hint 就會被忽略。
由於 Hint 是包在註解中的,於是如果 Hint 沒有被理會,也不會跳出任何錯誤的。
使用方式,是採用多行註解進行 Hint 的指定,適用於 SELECT、INSERT、UPDATE、DELETE 等 SQL 指令:
SELECT
/*+
放置 Hint 內容
*/
col_list FROM tbl;
|
以下利用企業版內建範例表格 emp,作一個簡單示範:
edb=# explain SELECT /*+ FIRST_ROWS(1) */ * FROM emp ORDER BY empno; QUERY PLAN --------------------------------------------------------------------- Index Scan using emp_pk on emp (cost=0.14..10.85 rows=14 width=45) (1 row) edb=# explain SELECT /*+ FULL(emp) */ * FROM emp ORDER BY empno; QUERY PLAN ----------------------------------------------------------- Sort (cost=1.41..1.44 rows=14 width=45) Sort Key: empno -> Seq Scan on emp (cost=0.00..1.14 rows=14 width=45) (3 rows)
類型
|
Hint
|
Row Number Correction
|
CHOOSE
ALL_ROWS
FIRST_ROWS
FIRST_ROWS_10
FIRST_ROWS_100
FIRST_ROWS_1000
FIRST_ROWS(數量)
|
Scan Method
|
FULL(表格名稱)
INDEX(表格名稱 INDEX名稱)
NO_INDEX(表格名稱 INDEX名稱)
|
Join Method
|
USE_HASH(表格名稱)
NO_USE_HASH(表格名稱)
USE_MERGE(表格名稱)
NO_USE_MERGE(表格名稱)
USE_NL(表格名稱)
NO_USE_NL(表格名稱)
|
Join Order
|
ORDERED
|
最後,社群也有針對 postgreSQL 開發出 Hint 套件,稱為 pg_hint_plan。不過該套件和 EDB 企業版內建的 Optimizer Hints 相比較,企業版仍然想辦法對應 Oracle 提供的 Hints 種類為主;而 pg_hint_plan 則是以 postgresql.conf 設定檔內的 Planner Method Configuration 小節對應的 Planner Methode 為主(詳見 Hint 支援清單),對於 Oracle 習慣用戶來說,還是從 Postgres 企業版比較親切一些。
參考
Postgres Query Optimizer 基本觀念:Hinting at PostgreSQL | Blog - 2ndQuadrant
其他資料:
對照的 Oracle 功能 Oracle Database Online Documentation 11g Release 2 (11.2) / Database Performance Tuning Guide / Using Optimizer Hints
社群版相似工具: pg_hint_plan
相關資料:
沒有留言:
張貼留言