這些配置引數提供了一種粗略的方法來影響查詢最佳化器選擇的查詢計劃。如果最佳化器為特定查詢選擇的預設計劃不是最優的,那麼使用這些配置引數之一強制最佳化器選擇不同計劃是一種臨時解決方案。改進最佳化器選擇計劃質量的更好方法包括調整規劃器成本常量(參見 Section 19.7.2)、手動執行 ANALYZE
、增加 default_statistics_target 配置引數的值,以及使用 ALTER TABLE SET STATISTICS
增加為特定列收集的統計資訊量。
enable_async_append
(boolean
) #啟用或停用查詢規劃器使用非同步感知追加計劃型別。預設值為 on
。
enable_bitmapscan
(boolean
) #啟用或停用查詢規劃器使用點陣圖掃描計劃型別。預設值為 on
。
enable_distinct_reordering
(boolean
) #啟用或停用查詢規劃器重新排序 DISTINCT 鍵以匹配輸入路徑的路徑鍵的能力。預設值為 on
。
enable_gathermerge
(boolean
) #啟用或停用查詢規劃器使用收集合並計劃型別。預設值為 on
。
enable_group_by_reordering
(boolean
) #控制查詢規劃器是否生成一個計劃,該計劃將 GROUP BY
鍵按計劃的子節點(如索引掃描)的鍵順序排序。停用時,查詢規劃器將生成一個計劃,其中 GROUP BY
鍵僅按 ORDER BY
子句(如果存在)排序。啟用時,規劃器將嘗試生成更有效的計劃。預設值為 on
。
enable_hashagg
(boolean
) #啟用或停用查詢規劃器使用雜湊聚合計劃型別。預設值為 on
。
enable_hashjoin
(boolean
) #啟用或停用查詢規劃器使用雜湊連線計劃型別。預設值為 on
。
enable_incremental_sort
(boolean
) #啟用或停用查詢規劃器使用增量排序步驟。預設值為 on
。
enable_indexscan
(boolean
) #啟用或停用查詢規劃器使用索引掃描和僅索引掃描計劃型別。預設值為 on
。另請參見 enable_indexonlyscan。
enable_indexonlyscan
(boolean
) #啟用或停用查詢規劃器使用僅索引掃描計劃型別(參見 Section 11.9)。預設值為 on
。要讓查詢規劃器考慮僅索引掃描,必須同時啟用 enable_indexscan 設定。
enable_material
(boolean
) #啟用或停用查詢規劃器使用物化。完全禁止物化是不可能的,但關閉此變數會阻止規劃器插入物化節點,除非是為了正確性所必需的情況。預設值為 on
。
enable_memoize
(boolean
) #啟用或停用查詢規劃器使用記憶化計劃來快取巢狀迴圈連線中引數化掃描的結果。噹噹前引數的結果已快取時,此計劃型別允許跳過對底層計劃的掃描。當需要更多空間來儲存新條目時,較少查詢的結果可能會被從快取中逐出。預設值為 on
。
enable_mergejoin
(boolean
) #啟用或停用查詢規劃器使用合併連線計劃型別。預設值為 on
。
enable_nestloop
(boolean
) #啟用或停用查詢規劃器使用巢狀迴圈連線計劃。完全禁止巢狀迴圈連線是不可能的,但關閉此變數會阻止規劃器在有其他可用方法時使用它。預設值為 on
。
enable_parallel_append
(boolean
) #啟用或停用查詢規劃器使用並行感知追加計劃型別。預設值為 on
。
enable_parallel_hash
(boolean
) #啟用或停用查詢規劃器使用具有並行雜湊的雜湊連線計劃型別。如果雜湊連線計劃未同時啟用,則此選項無效。預設值為 on
。
enable_partition_pruning
(boolean
) #啟用或停用查詢規劃器從計劃中消除分割槽表分割槽的能力。這還控制規劃器生成允許查詢執行器在查詢執行期間刪除(忽略)分割槽的查詢計劃的能力。預設值為 on
。有關詳細資訊,請參閱 Section 5.12.4。
enable_partitionwise_join
(boolean
) #啟用或停用查詢規劃器使用分割槽方式連線,這允許在分割槽表之間執行連線,透過連線匹配的分割槽。分割槽方式連線目前僅適用於連線條件包含所有分割槽鍵的情況,這些分割槽鍵必須是相同的資料型別,並且具有一對一匹配的子分割槽集。啟用此設定後,最終計劃中受 work_mem
限制記憶體使用的節點數量可能會根據掃描的分割槽數量線性增加。這可能導致查詢執行期間整體記憶體消耗大量增加。查詢規劃在記憶體和 CPU 方面也會變得更加昂貴。預設值為 off
。
enable_partitionwise_aggregate
(boolean
) #啟用或停用查詢規劃器使用分割槽方式分組或聚合,這允許對分割槽表上的分組或聚合分別對每個分割槽進行。如果 GROUP BY
子句不包含分割槽鍵,則只能在每個分割槽的基礎上進行部分聚合,之後還需要進行最終化。啟用此設定後,最終計劃中受 work_mem
限制記憶體使用的節點數量可能會根據掃描的分割槽數量線性增加。這可能導致查詢執行期間整體記憶體消耗大量增加。查詢規劃在記憶體和 CPU 方面也會變得更加昂貴。預設值為 off
。
enable_presorted_aggregate
(boolean
) #控制查詢規劃器是否生成一個計劃,該計劃將提供預先排序的行,以滿足查詢的 ORDER BY
/ DISTINCT
聚合函式所需的順序。停用時,查詢規劃器將生成一個計劃,該計劃將始終要求執行器在執行包含 ORDER BY
或 DISTINCT
子句的每個聚合函式之前執行排序。啟用時,規劃器將嘗試生成一個更有效的計劃,該計劃為聚合函式提供預先排序的輸入,以滿足它們進行聚合所需的順序。預設值為 on
。
enable_self_join_elimination
(boolean
) #啟用或停用查詢規劃器的最佳化,該最佳化分析查詢樹並將自連線替換為語義等價的單個掃描。僅考慮普通表。預設值為 on
。
enable_seqscan
(boolean
) #啟用或停用查詢規劃器使用順序掃描計劃型別。完全禁止順序掃描是不可能的,但關閉此變數會阻止規劃器在有其他可用方法時使用它。預設值為 on
。
enable_sort
(boolean
) #啟用或停用查詢規劃器使用顯式排序步驟。完全禁止顯式排序是不可能的,但關閉此變數會阻止規劃器在有其他可用方法時使用它。預設值為 on
。
enable_tidscan
(boolean
) #啟用或停用查詢規劃器使用TID掃描計劃型別。預設值為 on
。
本節描述的 成本 變數以任意比例測量。只有它們的相對值才重要,因此將它們全部按相同因子縮放上去或縮放下來都不會改變規劃器的選擇。預設情況下,這些成本變數基於順序頁面獲取的成本;即,seq_page_cost
通常設定為 1.0
,其他成本變數是相對於該值設定的。但如果願意,您可以使用不同的比例,例如特定機器上的實際執行時間(以毫秒為單位)。
不幸的是,沒有明確定義的方法來確定成本變數的理想值。最好將它們視為特定安裝將接收的整個查詢組合的平均值。這意味著僅基於幾次實驗來更改它們是非常危險的。
seq_page_cost
(floating point
) #設定規劃器對屬於順序獲取的磁碟頁面獲取的估計成本。預設值為 1.0。透過設定相同名稱的表空間引數(請參閱 ALTER TABLESPACE),可以覆蓋特定表空間的表和索引的此值。
random_page_cost
(floating point
) #設定規劃器對非順序獲取的磁碟頁面的估計成本。預設值為 4.0。透過設定相同名稱的表空間引數(請參閱 ALTER TABLESPACE),可以覆蓋特定表空間的表和索引的此值。
減小此值相對於 seq_page_cost
的值將導致系統偏好索引掃描;增加此值將使索引掃描看起來相對更昂貴。您可以同時增加或減小這兩個值,以改變磁碟 I/O 成本相對於 CPU 成本的重要性,CPU 成本由以下引數描述。
機械磁碟儲存的隨機訪問通常比順序訪問的四倍還要昂貴。但是,使用了較低的預設值(4.0),因為假設大多數對磁碟的隨機訪問(例如索引讀取)都在快取中。預設值可以看作是將隨機訪問建模為比順序訪問慢 40 倍,同時期望 90% 的隨機讀取被快取。
如果您認為 90% 的快取率不適合您的工作負載,您可以增加 random_page_cost 以更好地反映隨機儲存讀取的實際成本。相應地,如果您的資料很可能完全在快取中(例如,當資料庫小於伺服器總記憶體時),則可以減小 random_page_cost。隨機讀取成本相對於順序讀取成本較低的儲存(例如,固態硬碟)也可以透過較低的 random_page_cost 值(例如 1.1
)進行更好的建模。
儘管系統允許您將 random_page_cost
設定為小於 seq_page_cost
,但從物理上來說這樣做是不合理的。然而,當資料庫完全快取到 RAM 中時,將它們設定為相等是有意義的,因為在這種情況下,按順序觸控頁面沒有懲罰。此外,在高度快取的資料庫中,您應該相對於 CPU 引數降低這兩個值,因為讀取已經在 RAM 中的頁面的成本遠小於正常情況。
cpu_tuple_cost
(floating point
) #設定規劃器對查詢期間處理每一行的估計成本。預設值為 0.01。
cpu_index_tuple_cost
(floating point
) #設定規劃器對索引掃描期間處理每個索引條目的估計成本。預設值為 0.005。
cpu_operator_cost
(floating point
) #設定規劃器對查詢期間執行的每個運算子或函式處理的估計成本。預設值為 0.0025。
parallel_setup_cost
(floating point
) #設定規劃器啟動並行工作程序的估計成本。預設值為 1000。
parallel_tuple_cost
(floating point
) #設定規劃器將一個元組從一個並行工作程序傳輸到另一個程序的估計成本。預設值為 0.1。
min_parallel_table_scan_size
(integer
) #設定必須掃描的表資料的最小量,以便考慮並行掃描。對於並行順序掃描,掃描的表資料量始終等於表的大小,但當使用索引時,掃描的表資料量通常會少一些。如果此值沒有單位,則假定為塊,即 BLCKSZ
位元組,通常為 8kB。預設值為 8MB (8MB
)。
min_parallel_index_scan_size
(integer
) #設定必須掃描的索引資料的最小量,以便考慮並行掃描。請注意,並行索引掃描通常不會觸及整個索引;重要的是規劃器認為實際將被掃描的頁面數量。此引數還用於決定特定索引是否可以參與並行 VACUUM。請參閱 VACUUM。如果此值沒有單位,則假定為塊,即 BLCKSZ
位元組,通常為 8kB。預設值為 512kB (512kB
)。
effective_cache_size
(integer
) #設定規劃器對單個查詢可用磁碟快取的有效大小的假設。這被納入使用索引的成本估計中;較高的值會使索引掃描更可能被使用,較低的值會使順序掃描更可能被使用。設定此引數時,您應同時考慮 PostgreSQL 的共享緩衝區和將用於 PostgreSQL 資料檔案的核心磁碟快取部分,儘管某些資料可能同時存在於兩者中。此外,還應考慮不同表上併發查詢的預期數量,因為它們必須共享可用空間。此引數不會影響 PostgreSQL 分配的共享記憶體大小,也不會保留核心磁碟快取;它僅用於估計目的。系統也不會假設資料在查詢之間保留在磁碟快取中。如果此值沒有單位,則假定為塊,即 BLCKSZ
位元組,通常為 8kB。預設值為 4GB (4GB
)。(如果 BLCKSZ
不是 8kB,則預設值與其成比例縮放。)
jit_above_cost
(floating point
) #設定 JIT 編譯啟用的查詢成本(如果已啟用,請參閱 Chapter 30)。執行JIT會增加規劃時間,但可以加快查詢執行。將此設定為 -1
會停用 JIT 編譯。預設值為 100000
。
jit_inline_above_cost
(floating point
) #設定 JIT 編譯嘗試行內函數和運算子的查詢成本。內聯會增加規劃時間,但可以提高執行速度。將此值設定為小於 jit_above_cost
沒有意義。將其設定為 -1
會停用內聯。預設值為 500000
。
jit_optimize_above_cost
(floating point
) #設定 JIT 編譯應用昂貴最佳化操作的查詢成本。這種最佳化會增加規劃時間,但可以提高執行速度。將此值設定為小於 jit_above_cost
沒有意義,並且將其設定為大於 jit_inline_above_cost
可能不會有益。將其設定為 -1
會停用昂貴的最佳化操作。預設值為 500000
。
遺傳查詢最佳化器(GEQO)是一種使用啟發式搜尋進行查詢規劃的演算法。這會減少複雜查詢(連線許多關係的查詢)的規劃時間,但會犧牲生成有時不如正常窮舉搜尋演算法找到的計劃的質量。有關更多資訊,請參閱 Chapter 61。
geqo
(boolean
) #啟用或停用遺傳查詢最佳化。預設情況下啟用。在生產環境中通常最好不要停用它;geqo_threshold
變數提供了更精細地控制 GEQO 的方法。
geqo_threshold
(integer
) #使用遺傳查詢最佳化來規劃至少包含此數量 FROM
項的查詢。(請注意,FULL OUTER JOIN
構造僅計為一個 FROM
項。)預設值為 12。對於更簡單的查詢,通常最好使用常規的窮舉搜尋規劃器,但對於涉及許多表的查詢,窮舉搜尋需要太長時間,通常比執行次優計劃的懲罰還要長。因此,對查詢大小設定閾值是管理 GEQO 使用的一種便捷方式。
geqo_effort
(integer
) #控制 GEQO 中規劃時間和查詢計劃質量之間的權衡。此變數必須是 1 到 10 範圍內的整數。預設值為 5。較大的值會增加進行查詢規劃的時間,但也會增加選擇高效查詢計劃的可能性。
geqo_effort
實際上並不直接執行任何操作;它僅用於計算影響 GEQO 行為的其他變數的預設值(如下所述)。如果您願意,也可以手動設定其他引數。
geqo_pool_size
(integer
) #控制 GEQO 使用的池大小,即遺傳種群中的個體數量。它至少必須為兩個,並且有用的值通常在 100 到 1000 之間。如果將其設定為零(預設設定),則會根據 geqo_effort
和查詢中的表數量選擇一個合適的值。
geqo_generations
(integer
) #控制 GEQO 使用的代數,即演算法的迭代次數。它至少必須為一次,並且有用的值與池大小的範圍相同。如果將其設定為零(預設設定),則會根據 geqo_pool_size
選擇一個合適的值。
geqo_selection_bias
(floating point
) #控制 GEQO 使用的選擇偏差。選擇偏差是種群內的選擇壓力。值可以從 1.50 到 2.00;後者是預設值。
geqo_seed
(floating point
) #控制 GEQO 用於選擇連線順序搜尋空間的隨機路徑的隨機數生成器的初始值。該值範圍可以從零(預設值)到一。改變此值會改變探索的連線路徑集,並可能導致找到更好或更差的最佳路徑。
default_statistics_target
(integer
) #設定未透過 ALTER TABLE SET STATISTICS
設定列特定目標的表列的預設統計目標。較大的值會增加執行 ANALYZE
的時間,但可能會提高規劃器估計的質量。預設值為 100。有關 PostgreSQL 查詢規劃器使用統計資訊的更多資訊,請參閱 Section 14.2。
constraint_exclusion
(enum
) #控制查詢規劃器使用表約束來最佳化查詢。 constraint_exclusion
的允許值是 on
(檢查所有表的約束)、off
(從不檢查約束)和 partition
(僅檢查繼承子表和 UNION ALL
子查詢的約束)。 partition
是預設設定。它通常與傳統的繼承樹一起使用以提高效能。
當此引數允許對特定表執行時,規劃器會將查詢條件與表的 CHECK
約束進行比較,並省略掃描與約束矛盾的表。例如
CREATE TABLE parent(key integer, ...); CREATE TABLE child1000(check (key between 1000 and 1999)) INHERITS(parent); CREATE TABLE child2000(check (key between 2000 and 2999)) INHERITS(parent); ... SELECT * FROM parent WHERE key = 2400;
啟用約束排除後,此 SELECT
完全不會掃描 child1000
,從而提高效能。
目前,約束排除預設僅對常用於透過繼承樹實現表分割槽的場景啟用。為所有表啟用它會增加規劃開銷,這在簡單查詢中非常明顯,而且大多數情況下對簡單查詢不會產生任何好處。如果您沒有使用傳統繼承實現表分割槽,您可能希望完全關閉它。(請注意,分割槽表的等效功能由單獨的引數 enable_partition_pruning 控制。)
有關使用約束排除實現分割槽的更多資訊,請參閱 Section 5.12.5。
cursor_tuple_fraction
(floating point
) #設定規劃器對遊標檢索的行數的估計比例。預設值為 0.1。此設定值越小,規劃器越傾向於為遊標使用“快速啟動”計劃,該計劃將快速檢索前幾行,但可能需要很長時間才能檢索完所有行。值越大,對總估計時間的重視程度越高。在最大設定 1.0 下,遊標的規劃方式與常規查詢完全相同,僅考慮總估計時間,而不考慮何時可以返回第一行。
from_collapse_limit
(integer
) #如果生成的 FROM
列表項不超過此數量,規劃器會將子查詢合併到上層查詢中。較小的值會減少規劃時間,但可能會產生次優的查詢計劃。預設值為 8。有關更多資訊,請參閱 Section 14.3。
將此值設定為 geqo_threshold 或更高可能會觸發 GEQO 規劃器的使用,從而導致非最優計劃。請參閱 Section 19.7.3。
jit
(boolean
) #決定是否JIT編譯可以使用 PostgreSQL(如果可用,請參閱 Chapter 30)。預設值為 on
。
join_collapse_limit
(integer
) #當結果項列表不超過此數量時,規劃器會將顯式 JOIN
構造(除了 FULL JOIN
)重寫為 FROM
項列表。較小的值會減少規劃時間,但可能會產生次優的查詢計劃。
預設情況下,此變數設定為與 from_collapse_limit
相同,這對於大多數用途都是合適的。將其設定為 1 會阻止對顯式 JOIN
進行任何重新排序。因此,查詢中指定的顯式連線順序將是關係連線的實際順序。由於查詢規劃器並不總是選擇最優的連線順序,因此高階使用者可以選擇暫時將此變數設定為 1,然後顯式指定所需的連線順序。有關更多資訊,請參閱 Section 14.3。
將此值設定為 geqo_threshold 或更高可能會觸發 GEQO 規劃器的使用,從而導致非最優計劃。請參閱 Section 19.7.3。
plan_cache_mode
(enum
) #準備好的語句(無論是顯式準備還是隱式生成的,例如由 PL/pgSQL 生成的)都可以使用自定義計劃或通用計劃來執行。自定義計劃會在每次執行時根據其特定的引數值集重新建立,而通用計劃不依賴於引數值,可以在執行之間重用。因此,使用通用計劃可以節省規劃時間,但如果理想計劃強烈依賴於引數值,則通用計劃可能效率低下。這些選項之間的選擇通常是自動做出的,但可以使用 plan_cache_mode
進行覆蓋。允許的值是 auto
(預設值)、force_custom_plan
和 force_generic_plan
。此設定在快取計劃要執行時考慮,而不是在準備快取計劃時考慮。有關更多資訊,請參閱 PREPARE。
recursive_worktable_factor
(floating point
) #設定規劃器對 遞迴查詢 的工作表平均大小的估計,作為查詢初始非遞迴項估計大小的倍數。這有助於規劃器選擇最合適的方法來連線工作表與其他查詢表。預設值為 10.0
。較小的值(如 1.0
)在遞迴具有較低的“扇出”(從一步到下一步)時可能很有幫助,例如在最短路徑查詢中。圖分析查詢可能受益於大於預設值的值。
如果您在文件中看到任何不正確、與您對特定功能的使用經驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。