這些組態參數提供了一種粗略的方法來影響查詢最佳化器選擇的查詢計畫。如果最佳化器為特定查詢選擇的預設計畫不是最佳的,一個暫時性的解決方案是使用這些組態參數之一來強制最佳化器選擇不同的計畫。改善最佳化器選擇計畫品質的更好方法包括調整規劃器成本常數(請參閱第 19.7.2 節)、手動執行ANALYZE
、增加default_statistics_target組態參數的值,以及使用ALTER TABLE SET STATISTICS
增加為特定欄位收集的統計資料量。
enable_async_append
(boolean
) #啟用或停用查詢規劃器使用非同步感知附加計畫類型。預設值為 on
。
enable_bitmapscan
(boolean
) #啟用或停用查詢規劃器使用位元圖掃描計畫類型。預設值為 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
) #啟用或停用查詢規劃器使用僅索引掃描計畫類型(請參閱第 11.9 節)。預設值為 on
。還必須啟用enable_indexscan設定,查詢規劃器才會考慮僅索引掃描。
enable_material
(boolean
) #啟用或停用查詢規劃器使用實體化。不可能完全抑制實體化,但是關閉此變數會阻止規劃器插入實體化節點,除非在正確性要求的情況下。預設值為 on
。
enable_memoize
(boolean
) #啟用或停用查詢規劃器使用記憶化計畫,用於緩存巢狀迴圈聯結內部參數化掃描的結果。當目前參數的結果已在快取中時,此計畫類型允許跳過底層計畫的掃描。 當需要更多空間來存放新條目時,不太常查找的結果可能會從快取中逐出。 預設值為 on
。
enable_mergejoin
(boolean
) #啟用或停用查詢規劃器使用合併聯結 (merge-join) 計劃類型。預設值為 on
。
enable_nestloop
(boolean
) #啟用或停用查詢規劃器使用巢狀迴圈聯結 (nested-loop join) 計劃。雖然不可能完全抑制巢狀迴圈聯結,但關閉此變數會阻止規劃器在有其他方法可用時使用它。預設值為 on
。
enable_parallel_append
(boolean
) #啟用或停用查詢規劃器使用平行感知附加 (parallel-aware append) 計劃類型。預設值為 on
。
enable_parallel_hash
(boolean
) #啟用或停用查詢規劃器使用帶平行雜湊 (parallel hash) 的雜湊聯結 (hash-join) 計劃類型。如果未同時啟用雜湊聯結計劃,則無效。預設值為 on
。
enable_partition_pruning
(boolean
) #啟用或停用查詢規劃器從查詢計劃中排除分割表分割區的能力。 這也控制規劃器產生允許查詢執行器在查詢執行期間移除(忽略)分割區的查詢計劃的能力。預設值為 on
。詳情請參閱Section 5.12.4。
enable_partitionwise_join
(boolean
) #啟用或停用查詢規劃器使用分區聯結 (partitionwise join),這允許透過聯結匹配的分割區來執行分割表之間的聯結。 分區聯結目前僅適用於聯結條件包括所有分割鍵的情況,這些分割鍵必須具有相同的資料類型,並且具有一對一匹配的子分割區集。 啟用此設定後,最終計劃中記憶體使用量受到 work_mem
限制的節點數量可能會根據掃描的分割區數量線性增加。 這可能會導致查詢執行期間整體記憶體消耗的大幅增加。 查詢規劃在記憶體和 CPU 方面也變得更加昂貴。 預設值為 off
。
enable_partitionwise_aggregate
(boolean
) #啟用或停用查詢規劃器使用分區群組或聚合 (partitionwise grouping or aggregation),這允許對分割表上的群組或聚合分別針對每個分割區執行。 如果 GROUP BY
子句不包含分割鍵,則只能在每個分割區的基礎上執行部分聚合,並且必須稍後完成最終確定。 啟用此設定後,最終計劃中記憶體使用量受到 work_mem
限制的節點數量可能會根據掃描的分割區數量線性增加。 這可能會導致查詢執行期間整體記憶體消耗的大幅增加。 查詢規劃在記憶體和 CPU 方面也變得更加昂貴。 預設值為 off
。
enable_presorted_aggregate
(boolean
) #控制查詢規劃器是否將產生一個計劃,該計劃將提供以查詢的 ORDER BY
/ DISTINCT
聚合函數所需順序預先排序的列。 禁用時,查詢規劃器將產生一個計劃,該計劃始終要求執行器在執行包含 ORDER BY
或 DISTINCT
子句的每個聚合函數的聚合之前執行排序。 啟用後,規劃器將嘗試產生更有效的計劃,該計劃為聚合函數提供以它們進行聚合所需的順序預先排序的輸入。 預設值為 on
。
enable_seqscan
(boolean
) #啟用或停用查詢規劃器使用循序掃描 (sequential scan) 計劃類型。 雖然不可能完全抑制循序掃描,但關閉此變數會阻止規劃器在有其他方法可用時使用它。預設值為 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
) #設定規劃器對將一個 tuple 從一個平行工作程序傳輸到另一個程序的成本的估計值。預設值為 0.1。
min_parallel_table_scan_size
(integer
) #設定為了考慮使用平行掃描而必須掃描的最小表格資料量。對於平行循序掃描,掃描的表格資料量始終等於表格的大小,但是當使用索引時,掃描的表格資料量通常會更少。如果此值在沒有指定單位的情況下指定,則將其視為區塊,即 BLCKSZ
位元組,通常為 8kB。預設值為 8 百萬位元組 (8MB
)。
min_parallel_index_scan_size
(integer
) #設定為了考慮使用平行掃描而必須掃描的最小索引資料量。請注意,平行索引掃描通常不會觸及整個索引;相關的是規劃器認為掃描實際會觸及的頁面數。此參數也用於決定特定索引是否可以參與平行 vacuum。請參閱 VACUUM。如果此值在沒有指定單位的情況下指定,則將其視為區塊,即 BLCKSZ
位元組,通常為 8kB。預設值為 512 千位元組 (512kB
)。
effective_cache_size
(integer
) #設定規劃器對於單一查詢可用的有效磁碟快取大小的假設。這會被納入使用索引的成本估算中;較高的值會使索引掃描更有可能被使用,而較低的值會使循序掃描更有可能被使用。在設定這個參數時,您應該同時考慮 PostgreSQL 的共享緩衝區和核心磁碟快取中用於 PostgreSQL 資料檔案的部分,儘管某些資料可能同時存在於這兩個地方。此外,也要考慮到不同資料表上預期的並行查詢數量,因為它們需要共享可用的空間。此參數不會影響 PostgreSQL 分配的共享記憶體大小,也不會保留核心磁碟快取;它僅用於估算目的。系統也不假設資料在查詢之間會保留在磁碟快取中。如果此值在指定時沒有單位,則會被視為區塊,也就是 BLCKSZ
位元組,通常為 8kB。預設值為 4 GB (4GB
)。(如果 BLCKSZ
不是 8kB,則預設值會按比例縮放。)
jit_above_cost
(floating point
) #設定啟用 JIT 編譯的查詢成本閾值(如果已啟用;請參閱第 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) 是一種使用啟發式搜尋進行查詢規劃的演算法。這減少了複雜查詢(連接多個關係的查詢)的規劃時間,但代價是產生的計劃有時不如正常的詳盡搜尋演算法找到的計劃。更多資訊請參閱第 60 章。
geqo
(boolean
) #啟用或停用基因查詢最佳化。預設為啟用。通常最好不要在生產環境中將其關閉;geqo_threshold
變數提供了對 GEQO 更細緻的控制。
geqo_threshold
(integer
) #使用基因查詢最佳化來規劃至少包含這麼多 FROM
項目的查詢。(請注意,FULL OUTER JOIN
結構僅計為一個 FROM
項目。)預設值為 12。對於更簡單的查詢,通常最好使用常規的詳盡搜尋規劃器,但對於包含許多資料表的查詢,詳盡搜尋需要太長時間,通常比執行次佳計劃的代價更長。因此,查詢大小的閾值是一種方便的管理 GEQO 使用方式。
geqo_effort
(integer
) #控制 GEQO 中規劃時間和查詢計劃品質之間的權衡。此變數必須是介於 1 到 10 之間的整數。預設值為五。較大的值會增加查詢規劃所花費的時間,但也會增加選擇有效查詢計劃的可能性。
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 隨機數產生器的初始值,GEQO 使用它來選擇遍歷連接順序搜尋空間的隨機路徑。該值範圍可以從零(預設值)到一。改變該值會更改探索的連接路徑集,並可能導致找到更好或更差的最佳路徑。
default_statistics_target
(integer
) #設定沒有透過 ALTER TABLE SET STATISTICS
設定欄位特定目標的資料表欄位的預設統計目標。較大的值會增加執行 ANALYZE
所需的時間,但可能會提高規劃器估算的品質。預設值為 100。有關 PostgreSQL 查詢規劃器使用統計資料的更多資訊,請參閱 第 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 控制。)
有關使用約束排除實作分割的更多資訊,請參閱 第 5.12.5 節。
cursor_tuple_fraction
(floating point
) #設定規劃器對將檢索的游標列數比例的估計。預設值為 0.1。此設定的較小值會使規劃器偏向於對游標使用 “快速啟動” 方案,該方案會快速檢索前幾列,但可能需要很長時間才能提取所有列。較大的值會更強調總估計時間。在 1.0 的最大設定下,游標的規劃方式與常規查詢完全相同,僅考慮總估計時間,而不考慮第一列可能交付的時間。
from_collapse_limit
(integer
) #如果產生的 FROM
清單不超過此項目的數量,規劃器會將子查詢合併到上層查詢中。較小的值會減少規劃時間,但可能會產生較差的查詢方案。預設值為 8。有關更多資訊,請參閱 第 14.3 節。
將此值設定為 geqo_threshold 或更高可能會觸發使用 GEQO 規劃器,從而產生非最佳方案。請參閱 第 19.7.3 節。
jit
(boolean
) #決定是否JIT如果可用,PostgreSQL 可以使用編譯(請參閱 第 30 章)。預設值為 on
。
join_collapse_limit
(integer
) #只要產生的清單不超過此項目的數量,規劃器就會將明確的 JOIN
建構(除了 FULL JOIN
)重寫為 FROM
項目清單。較小的值會減少規劃時間,但可能會產生較差的查詢方案。
預設情況下,此變數設定為與 from_collapse_limit
相同,這適合大多數用途。將其設定為 1 可防止重新排序任何明確的 JOIN
。因此,查詢中指定的明確連接順序將是關係連接的實際順序。由於查詢規劃器並不總是選擇最佳連接順序,因此進階使用者可以選擇暫時將此變數設定為 1,然後明確指定他們想要的連接順序。有關更多資訊,請參閱 第 14.3 節。
將此值設定為 geqo_threshold 或更高可能會觸發使用 GEQO 規劃器,從而產生非最佳方案。請參閱 第 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
)可能會有所幫助。圖形分析查詢可能會受益於大於預設的值。
如果您在文件中看到任何不正確、與您使用特定功能時的經驗不符或需要進一步澄清的地方,請使用此表格回報文件問題。