使用hint固定執行計劃提高性能
更新時間 2025-02-05 09:37:24
最近更新時間: 2025-02-05 09:37:24
分享文章
本文為您介紹使用hint固定執行計劃提高性能的具體操作。
在有些場景,優化器并不一定會選擇最優的執行計劃,此時可以通過hint來固定執行計劃,讓優化器選擇指定的方式執行。
常見的有以下一些情況:
使用hint指定關聯方式
可能會發現,有此場景優化器沒有沒有使用最優的關聯方式,可以通過hint來固化,例如,使用hint指定hashjoin:
select /*+hashjoin(table1, table2)*/
有時候SQL比較復雜,hint方式指定了hashjoin,優化器還是走了nestedloop,可以通過設置SQL對應的參數來調整:
select /*+ set (enable_nestloop off)*/ xxx
使用hint開啟并行
當SQL中存在大表全表掃描,可以嘗試通過hint方式開啟并行。
- 對單個表加并行:
select /* +parallel(table_name 8) */ xxx; - 對多個表加并行:
select /*+parallel(table_name1 8) parallel(table_name2 8)*/ xxx;
常用hint表:
| 分類 | 格式 | 說明 |
|---|---|---|
| 掃描方法 | SeqScan(table) | 強制對指定表使用序列掃描。 |
| TidScan(table) | 強制對指定表使用TID掃描。 | |
| IndexScan(table[ index...]) | 強制對指定表使用索引掃描,可以指定某個索引。 | |
| IndexOnlyScan(table[ index...]) | 強制對指定表僅使用索引掃描,可以指定某個索引。 | |
| BitmapScan(table[ index...]) | 強制對指定表使用位圖掃描,可以指定某個索引。 | |
| IndexScanRegexp(table[ POSIX Regexp...]) | 強制對指定表使用索引掃描或僅索引掃描或位圖掃描。使用正則匹配。 | |
| IndexOnlyScanRegexp(table[ POSIX Regexp...]) | ||
| BitmapScanRegexp(table[ POSIX Regexp...]) | ||
| NoSeqScan(table) | 對指定表禁止使用序列掃描。 | |
| NoTidScan(table) | 對指定表禁止使用TID掃描。 | |
| NoIndexScan(table) | 對指定表禁止使用索引掃描(包括僅索引掃描)。 | |
| NoIndexOnlyScan(table) | 對指定表禁止使用僅索引掃描。 | |
| NoBitmapScan(table) | 對指定表禁止使用位圖掃描。 | |
| 連接方法 | NestLoop(table table[ table...]) | 強制對指定表使用嵌套循環連接。 |
| HashJoin(table table[ table...]) | 強制對指定表使用哈希連接。 | |
| MergeJoin(table table[ table...]) | 強制對指定表使用合并連接。 | |
| NoNestLoop(table table[ table...]) | 對指定表禁止使用嵌套循環連接。 | |
| NoHashJoin(table table[ table...]) | 對指定表禁止使用哈希連接。 | |
| NoMergeJoin(table table[ table...]) | 對指定表禁止使用合并連接 | |
| 連接順序 | Leading(table table[ table...]) | 強制連接順序。 |
| Leading( |
強制連接順序和方向, | |
| 行號校正 | Rows(table table[ table...] correction) | 糾正由指定表組成的聯接結果的行號。可用的校正方法有絕對值(# |
| 并行查詢配置 | Parallel(table <# of workers> [soft | hard]) |
| GUC | Set(GUC-param value) | 計劃器運行時,設置GUC參數。 |