PostgreSQL 查詢規(guī)劃

2021-08-31 12:00 更新
19.7.1. 規(guī)劃器方法配制
19.7.2. 規(guī)劃器代價(jià)常量
19.7.3. 遺傳查詢優(yōu)化
19.7.4. 其他規(guī)劃器選項(xiàng)

19.7.1. 規(guī)劃器方法配制

這些配置參數(shù)提供了影響查詢優(yōu)化器選擇查詢規(guī)劃的原始方法。如果優(yōu)化器 為特定的查詢選擇的缺省規(guī)劃并不是最優(yōu),那么我們就可以通過使用這些 配置參數(shù)強(qiáng)制優(yōu)化器選擇一個(gè)更好的規(guī)劃來(lái)temporary解決這個(gè) 問題。不過,永久地關(guān)閉這些設(shè)置幾乎從不是個(gè)好主意。更好的改善優(yōu)化器 選擇規(guī)劃的方法包括調(diào)節(jié)Section 18.6.2、 更頻繁運(yùn)行ANALYZE、增大配置參數(shù) default_statistics_target的值、使用 ALTER TABLE SET STATISTICS為某個(gè)字段增加收集的 統(tǒng)計(jì)信息。 這些配置參數(shù)影響查詢優(yōu)化器選擇查詢計(jì)劃的暴力方法。如果優(yōu)化器為一個(gè)特定查詢選擇的默認(rèn)計(jì)劃不是最優(yōu)的,一種臨時(shí)解決方案是使用這些配置參數(shù)之一來(lái)強(qiáng)制優(yōu)化器選擇一個(gè)不同的計(jì)劃。提高優(yōu)化器選擇的計(jì)劃質(zhì)量的更好的方式包括調(diào)整規(guī)劃器的代價(jià)常數(shù)(見本文中第 19.7.2 節(jié))、手工運(yùn)行 ANALYZE 、增加?default_statistics_target?配置參數(shù)的值以及使用ALTER TABLE SET STATISTICS增加為特定列收集的統(tǒng)計(jì)信息量。

enable_bitmapscan (boolean)

允許或禁止查詢規(guī)劃器使用位圖掃描計(jì)劃類型。默認(rèn)值是on。

enable_gathermerge (boolean)

啟用或者禁用查詢規(guī)劃器對(duì)收集歸并計(jì)劃類型的使用。默認(rèn)值是on

enable_hashagg (boolean)

允許或禁用查詢規(guī)劃器使用哈希聚集計(jì)劃類型。默認(rèn)值是on

enable_hashjoin (boolean)

允許或禁止查詢規(guī)劃器使用哈希連接計(jì)劃類型。默認(rèn)值是on。

enable_incremental_sort (boolean)

啟用或禁用查詢規(guī)劃器對(duì)增量排序步驟的使用。默認(rèn)為on

enable_indexscan (boolean)

允許或禁止查詢規(guī)劃器使用索引掃描計(jì)劃類型。默認(rèn)值是on

enable_indexonlyscan (boolean)

允許或禁止查詢規(guī)劃器使用只用索引掃描計(jì)劃類型(見第 11.9 節(jié))。默認(rèn)值是on

enable_material (boolean)

允許或者禁止查詢規(guī)劃器使用物化。它不可能完全禁用物化,但是關(guān)閉這個(gè)變量將阻止規(guī)劃器插入物化節(jié)點(diǎn),除非為了保證正確性。默認(rèn)值是on。

enable_mergejoin (boolean)

允許或禁止查詢規(guī)劃器使用歸并連接計(jì)劃類型。默認(rèn)值是on。

enable_nestloop (boolean)

允許或禁止查詢規(guī)劃器使用嵌套循環(huán)連接計(jì)劃。它不可能完全禁止嵌套循環(huán)連接,但是關(guān)閉這個(gè)變量將使得規(guī)劃器盡可能優(yōu)先使用其他方法。默認(rèn)值是on。

enable_parallel_append (boolean)

允許或禁止查詢規(guī)劃器使用并行追加計(jì)劃類型。默認(rèn)值是on。

enable_parallel_hash (boolean)

允許或禁止查詢規(guī)劃器對(duì)并行哈希使用哈希連接計(jì)劃類型。如果哈希連接計(jì)劃也沒有啟用,這個(gè)參數(shù)沒有效果。默認(rèn)值是on。

enable_partition_pruning (boolean)

允許或者禁止查詢規(guī)劃器從查詢計(jì)劃中消除一個(gè)分區(qū)表的分區(qū)。這也控制著規(guī)劃器產(chǎn)生允許執(zhí)行器在查詢執(zhí)行期間移除(忽略)分區(qū)的查詢計(jì)劃的能力。默認(rèn)值是on。詳情請(qǐng)參考第 5.11.4 節(jié)

enable_partitionwise_join (boolean)

允許或者禁止查詢規(guī)劃器使用面向分區(qū)的連接,這使得分區(qū)表之間的連接以連接匹配的分區(qū)的方式來(lái)執(zhí)行。 面向分區(qū)的連接當(dāng)前只適用于連接條件包括所有分區(qū)鍵的情況,連接條件必須是相同的數(shù)據(jù)類型并且子分區(qū)集合要1對(duì)1匹配。 由于面向分區(qū)的連接規(guī)劃在規(guī)劃期間會(huì)使用可觀的CPU時(shí)間和內(nèi)存,所以默認(rèn)值為off。

enable_partitionwise_aggregate (boolean)

允許或者禁止查詢規(guī)劃器使用面向分區(qū)的分組或聚集,這使得在分區(qū)表上的分組或聚集可以在每個(gè)分區(qū)上分別執(zhí)行。如果GROUP BY子句不包括分區(qū)鍵,只有部分聚集能夠以基于每個(gè)分區(qū)的方式執(zhí)行,并且finalization必須最后執(zhí)行。由于面向分區(qū)的分組或聚集在規(guī)劃期間會(huì)使用可觀的CPU時(shí)間和內(nèi)存,所以默認(rèn)值為off。

enable_seqscan (boolean)

允許或禁止查詢規(guī)劃器使用順序掃描計(jì)劃類型。它不可能完全禁止順序掃描,但是關(guān)閉這個(gè)變量將使得規(guī)劃器盡可能優(yōu)先使用其他方法。默認(rèn)值是on。

enable_sort (boolean)

允許或禁止查詢規(guī)劃器使用顯式排序步驟。它不可能完全禁止顯式排序,但是關(guān)閉這個(gè)變量將使得規(guī)劃器盡可能優(yōu)先使用其他方法。默認(rèn)值是on。

enable_tidscan (boolean)

允許或禁止查詢規(guī)劃器使用TID掃描計(jì)劃類型。默認(rèn)值是on。

19.7.2. 規(guī)劃器代價(jià)常量

這一節(jié)中描述的代價(jià)變量可以按照任意尺度衡量。我們只關(guān)心它們的相對(duì)值,將它們以相同的因子縮放不會(huì)影響規(guī)劃器的選擇。默認(rèn)情況下,這些代價(jià)變量是基于順序頁(yè)面獲取的代價(jià)的,即seq_page_cost被設(shè)置為1.0并且其他代價(jià)變量都參考它來(lái)設(shè)置。不過你可以使用你喜歡的不同尺度,例如在一個(gè)特定機(jī)器上的真實(shí)執(zhí)行時(shí)間。

注意

不幸的是,沒有一種良定義的方法來(lái)決定代價(jià)變量的理想值。它們最好被作為一個(gè)特定安裝將接收到的查詢的平均值來(lái)對(duì)待。這意味著基于少量的實(shí)驗(yàn)來(lái)改變它們是有風(fēng)險(xiǎn)的。

seq_page_cost (floating point)

設(shè)置規(guī)劃器計(jì)算一次順序磁盤頁(yè)面抓取的開銷。默認(rèn)值是1.0。 通過設(shè)置同名的表空間參數(shù),這個(gè)值可以重寫為一個(gè)特定的表空間。 參閱ALTER TABLESPACE。 設(shè)置規(guī)劃器對(duì)一系列順序磁盤頁(yè)面獲取中的一次的代價(jià)估計(jì)。默認(rèn)值是 1.0。通過把表和索引放在一個(gè)特殊的表空間(要設(shè)置該表空間的同名參數(shù))中可以覆蓋這個(gè)值(見ALTER TABLESPACE)。

random_page_cost (floating point)

設(shè)置規(guī)劃器對(duì)一次非順序獲取磁盤頁(yè)面的代價(jià)估計(jì)。默認(rèn)值是 4.0。通過把表和索引放在一個(gè)特殊的表空間(要設(shè)置該表空間的同名參數(shù))中可以覆蓋這個(gè)值(見ALTER TABLESPACE)。

減少這個(gè)值(相對(duì)于seq_page_cost)將導(dǎo)致系統(tǒng)更傾向于索引掃描;提高它將讓索引掃描看起來(lái)相對(duì)更昂貴。你可以一起提高或降低兩個(gè)值來(lái)改變磁盤 I/O 代價(jià)相對(duì)于 CPU 代價(jià)的重要性,后者由下列參數(shù)描述。

對(duì)磁盤存儲(chǔ)的隨機(jī)訪問通常比順序訪問要貴不止四倍。但是,由于對(duì)磁盤的大部分隨機(jī)訪問(例如被索引的讀?。┒急患俣ㄔ诟咚倬彌_中進(jìn)行,所以使用了一個(gè)較低的默認(rèn)值(4.0)。默認(rèn)值可以被想成把隨機(jī)訪問建模為比順序訪問慢 40 倍,而期望 90% 的隨機(jī)讀取會(huì)被緩存。

如果你相信 90% 的緩沖率對(duì)你的負(fù)載是一個(gè)不正確的假設(shè),你可以增加 random_page_cost 來(lái)更好的反映隨機(jī)存儲(chǔ)讀取的真正代價(jià)。 相應(yīng)地,如果你的數(shù)據(jù)可以完全放在高速緩存中(例如當(dāng)數(shù)據(jù)庫(kù)小于服務(wù)器總內(nèi)存時(shí)),降低 random_page_cost 可能是合適的。 為具有很低的隨機(jī)讀取代價(jià)的存儲(chǔ)(例如固態(tài)驅(qū)動(dòng)器)采用較低的 random_page_cost 值可能更好,例如1.1。

提示

雖然允許你將random_page_cost設(shè)置的比 seq_page_cost小,但是物理上的實(shí)際情況并不受此影響。 然而當(dāng)所有數(shù)據(jù)庫(kù)都位于內(nèi)存中時(shí),兩者設(shè)置為相等是非常合理的,因?yàn)?在此情況下,亂序抓取并不比順序抓取開銷更大。同樣,在緩沖率很高的 數(shù)據(jù)庫(kù)上,你應(yīng)當(dāng)相對(duì)于 CPU 開銷同時(shí)降低這兩個(gè)值,因?yàn)楂@取內(nèi)存中 的頁(yè)比通常情況下的開銷小許多。 盡管系統(tǒng)可以是你把random_page_cost設(shè)置得小于seq_page_cost,但是實(shí)際上沒有意義。不過,如果數(shù)據(jù)庫(kù)被整個(gè)緩存在 RAM 中,將它們?cè)O(shè)置為相等是有意義的,因?yàn)樵谀欠N情況中不按順序訪問頁(yè)面是沒有懲罰值的。同樣,在一個(gè)高度緩存化的數(shù)據(jù)庫(kù)中,你應(yīng)該相對(duì)于 CPU 參數(shù)降低這兩個(gè)值,因?yàn)楂@取一個(gè)已經(jīng)在 RAM 中的頁(yè)面的代價(jià)要遠(yuǎn)小于通常情況下的代價(jià)。

cpu_tuple_cost (floating point)

設(shè)置規(guī)劃器對(duì)一次查詢中處理每一行的代價(jià)估計(jì)。默認(rèn)值是 0.01。

cpu_index_tuple_cost (floating point)

設(shè)置規(guī)劃器對(duì)一次索引掃描中處理每一個(gè)索引項(xiàng)的代價(jià)估計(jì)。默認(rèn)值是 0.005。

cpu_operator_cost (floating point)

設(shè)置規(guī)劃器對(duì)于一次查詢中處理每個(gè)操作符或函數(shù)的代價(jià)估計(jì)。默認(rèn)值是 0.0025。

parallel_setup_cost (floating point)

設(shè)置規(guī)劃器對(duì)啟動(dòng)并行工作者進(jìn)程的代價(jià)估計(jì)。默認(rèn)是 1000。

parallel_tuple_cost (floating point)

設(shè)置規(guī)劃器對(duì)于從一個(gè)并行工作者進(jìn)程傳遞一個(gè)元組給另一個(gè)進(jìn)程的代價(jià)估計(jì)。默認(rèn)是 0.1。

min_parallel_table_scan_size (integer)

為必須掃描的表數(shù)據(jù)量設(shè)置一個(gè)最小值,掃描的表數(shù)據(jù)量超過這一個(gè)值才會(huì)考慮使用并行掃描。 對(duì)于并行順序掃描,被掃描的表數(shù)據(jù)量總是等于表的尺寸,但是在使用索引時(shí),被掃描的表數(shù)據(jù)量通常會(huì)更小。 如果指定值時(shí)沒有單位,則以塊為單位,即BLCKSZ字節(jié),通常為8kB。默認(rèn)值是8兆字節(jié)(8MB)。

min_parallel_index_scan_size (integer)

為必須掃描的索引數(shù)據(jù)量設(shè)置一個(gè)最小值,掃描的索引數(shù)據(jù)量超過這一個(gè)值時(shí)才會(huì)考慮使用并行掃描。 注意并行索引掃描通常并不會(huì)觸及整個(gè)索引,它是規(guī)劃器認(rèn)為該掃描會(huì)實(shí)際用到的相關(guān)頁(yè)面的數(shù)量。 這個(gè)參數(shù)還用于決定特定的索引是否參與并行vacuum。參見????VACUUM????。 如果指定值時(shí)沒有單位,則以塊為單位,即BLCKSZ字節(jié),通常為8kB。默認(rèn)值是512千字節(jié)( 512kB)。

effective_cache_size (integer)

設(shè)置規(guī)劃器對(duì)一個(gè)單一查詢可用的有效磁盤緩沖區(qū)尺寸的假設(shè)。 這個(gè)參數(shù)會(huì)被考慮在使用一個(gè)索引的代價(jià)估計(jì)中,更高的數(shù)值會(huì)使得索引掃描更可能被使用,更低的數(shù)值會(huì)使得順序掃描更可能被使用。 在設(shè)置這個(gè)參數(shù)時(shí),你還應(yīng)該考慮PostgreSQL的共享緩沖區(qū)以及將被用于PostgreSQL數(shù)據(jù)文件的內(nèi)核磁盤緩沖區(qū),盡管有些數(shù)據(jù)可能在兩個(gè)地方都存在。 另外,還要考慮預(yù)計(jì)在不同表上的并發(fā)查詢數(shù)目,因?yàn)樗鼈儽仨毠蚕砜捎玫目臻g。 這個(gè)參數(shù)對(duì)PostgreSQL分配的共享內(nèi)存尺寸沒有影響,它也不會(huì)保留內(nèi)核磁盤緩沖,它只用于估計(jì)的目的。系統(tǒng)也不會(huì)假設(shè)在查詢之間數(shù)據(jù)會(huì)保留在磁盤緩沖中。 如果指定值時(shí)沒有單位,則以塊為單位,即BLCKSZ字節(jié),通常為8kB。 默認(rèn)值是 4吉字節(jié)(4GB)。(如果BLCKSZ不是8kB,默認(rèn)值會(huì)按比例縮放它。)

jit_above_cost (floating point)

設(shè)置激活JIT編譯的查詢代價(jià),如果查詢代價(jià)超過這個(gè)值就會(huì)激活JIT編譯(如果啟用了JIT,見第 31 章)。執(zhí)行JIT會(huì)消耗一些規(guī)劃時(shí)間,但是能夠加速查詢執(zhí)行。將這個(gè)值設(shè)置為-1會(huì)禁用JIT編譯。默認(rèn)值是 100000。

jit_inline_above_cost (floating point)

設(shè)置JIT編譯嘗試內(nèi)聯(lián)函數(shù)和操作符的查詢代價(jià)閾值,如果查詢代價(jià)超過這個(gè)值,JIT編譯就會(huì)嘗試內(nèi)聯(lián)。內(nèi)聯(lián)會(huì)增加規(guī)劃時(shí)間,但是可以提高執(zhí)行速度。將這個(gè)參數(shù)設(shè)置成小于jit_above_cost是沒有意義的。將這個(gè)參數(shù)設(shè)置為-1會(huì)禁用內(nèi)聯(lián)。默認(rèn)值是500000

jit_optimize_above_cost (floating point)

設(shè)置JIT編譯應(yīng)用優(yōu)化的查詢代價(jià)閾值,如果查詢代價(jià)超過這個(gè)值,JIT編譯就會(huì)應(yīng)用開銷較大的優(yōu)化。這類優(yōu)化會(huì)增加規(guī)劃時(shí)間,但是更能夠改進(jìn)執(zhí)行速度。將這個(gè)參數(shù)設(shè)置成小于jit_above_cost是沒有意義的,并且將它設(shè)置成大于jit_inline_above_cost也未必有益。將這個(gè)參數(shù)設(shè)置為-1會(huì)禁用開銷較大的優(yōu)化。默認(rèn)值是 500000。

19.7.3. 遺傳查詢優(yōu)化

GEQO是一個(gè)使用探索式搜索來(lái)執(zhí)行查詢規(guī)劃的算法。它可以降低負(fù)載查詢的規(guī)劃時(shí)間。 同時(shí),GEQO的檢索是隨機(jī)的,因此它的規(guī)劃可能會(huì)不可確定。 更多信息參閱Chapter 50。 遺傳查詢規(guī)劃器(GEQO)是一種使用啟發(fā)式搜索來(lái)進(jìn)行查詢規(guī)劃的算法。它可以降低對(duì)于復(fù)雜查詢(連接很多表的查詢)的規(guī)劃時(shí)間,但是代價(jià)是它產(chǎn)生的計(jì)劃有時(shí)候要差于使用窮舉搜索算法找到的計(jì)劃。詳見第 59 章

geqo (boolean)

允許或禁止遺傳查詢優(yōu)化。默認(rèn)是啟用。在生產(chǎn)環(huán)境中通常最好不要關(guān)閉它。geqo_threshold變量提供了對(duì) GEQO 更細(xì)粒度的空值。

geqo_threshold (integer)

只有當(dāng)涉及的FROM項(xiàng)數(shù)量至少有這么多個(gè)的時(shí)候,才使用遺傳查詢優(yōu)化(注意一個(gè)FULL OUTER JOIN只被計(jì)為一個(gè)FROM項(xiàng))。默認(rèn)值是 12。對(duì)于更簡(jiǎn)單的查詢,通常會(huì)使用普通的窮舉搜索規(guī)劃器,但是對(duì)于有很多表的查詢窮舉搜索會(huì)花很長(zhǎng)時(shí)間,通常比執(zhí)行一個(gè)次優(yōu)的計(jì)劃帶來(lái)的懲罰值還要長(zhǎng)。因此,在查詢尺寸上的一個(gè)閾值是管理 GEQO 使用的一種方便的方法。

geqo_effort (integer)

控制 GEQO 里規(guī)劃時(shí)間和查詢規(guī)劃的有效性之間的平衡。這個(gè)變量必須是 一個(gè)范圍從 1 到 10 的整數(shù)。缺省值是 5 。大的數(shù)值增加花在進(jìn)行查詢 規(guī)劃上面的時(shí)間,但是也很可能會(huì)提高選中更有效的查詢規(guī)劃的幾率。 控制 GEQO 中規(guī)劃時(shí)間和查詢計(jì)劃質(zhì)量之間的折中。這個(gè)變量必須是位于 1 到 10 之間的一個(gè)整數(shù)。默認(rèn)值是 5。更大的值會(huì)增加花在查詢規(guī)劃上的時(shí)間,但是同時(shí)也增加了選擇一個(gè)高效查詢計(jì)劃的可能性。

geqo_effort實(shí)際并不直接做任何事情;它只是被用來(lái)計(jì)算其他影響 GEQO 行為的變量(如下所述)的默認(rèn)值。如果你愿意,你可以手工設(shè)置其他參數(shù)。

geqo_pool_size (integer)

控制 GEQO 使用的池尺寸,它就是遺傳種群中的個(gè)體數(shù)目。它必須至少為 2,且有用的值通常在 100 到 1000 之間。如果它被設(shè)置為零(默認(rèn)設(shè)置)則會(huì)基于geqo_effort和查詢中表的數(shù)量選擇一個(gè)合適的值。

geqo_generations (integer)

控制 GEQO 使用的子代數(shù)目。子代的意思是算法的迭代次數(shù)。它必須至少 是 1 ,有用的值范圍和池大小相同。如果設(shè)置為零(缺省),那么將基于 geqo_pool_size選取合適的值。 控制 GEQO 使用的代數(shù),也是算法的迭代次數(shù)。它必須至少為 1,并且有用值的范圍和池尺寸相同。如果它被設(shè)置為零(默認(rèn)設(shè)置)則會(huì)基于geqo_pool_size選擇一個(gè)合適的值。

geqo_selection_bias (floating point)

控制 GEQO 使用的選擇偏好。選擇偏好是種群中的選擇壓力。值可以是 1.5 到 2.0 之間,后者是默認(rèn)值。

geqo_seed (floating point)

控制 GEQO 使用的隨機(jī)數(shù)生成器的初始值,隨機(jī)數(shù)生成器用于在連接順序搜索空間中選擇隨機(jī)路徑。該值可以從 0 (默認(rèn)值)到 1。變化該值會(huì)改變被探索的連接路徑集合,并且可能導(dǎo)致找到一個(gè)更好或更差的路徑。

19.7.4. 其他規(guī)劃器選項(xiàng)

default_statistics_target (integer)

為沒有通過ALTER TABLE SET STATISTICS設(shè)置列相關(guān)目標(biāo)的表列設(shè)置默認(rèn)統(tǒng)計(jì)目標(biāo)。更大的值增加了需要做ANALYZE的時(shí)間,但是可能會(huì)改善規(guī)劃器的估計(jì)質(zhì)量。默認(rèn)值是 100。有關(guān)PostgreSQL查詢規(guī)劃器使用的統(tǒng)計(jì)信息的更多內(nèi)容, 請(qǐng)參考第 14.2 節(jié)。

constraint_exclusion (enum)

控制查詢規(guī)劃器對(duì)表約束的使用,以優(yōu)化查詢。 constraint_exclusion的允許值是on(對(duì)所有表檢查約束)、off(從不檢查約束)和partition(只對(duì)繼承的子表和UNION ALL子查詢檢查約束)。 partition是默認(rèn)設(shè)置。它通常與傳統(tǒng)的繼承樹一起使用來(lái)提高性能。

當(dāng)對(duì)一個(gè)特定表允許這個(gè)參數(shù),規(guī)劃器比較查詢條件和表的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;

在啟用約束排除時(shí),這個(gè)SELECT將完全不會(huì)掃描child1000,從而提高性能。

目前,約束排除只在通過繼承樹實(shí)現(xiàn)表分區(qū)的情況中被默認(rèn)啟用。為所有表啟用它會(huì)增加額外的規(guī)劃開銷,特別是在簡(jiǎn)單查詢上并且不會(huì)產(chǎn)生任何好處。 如果沒有用傳統(tǒng)繼承樹分區(qū)的表時(shí),最好是完全關(guān)閉它。(注意分區(qū)表的等效特性是由單獨(dú)的參數(shù)控制的,?enable_partition_pruning?.)

更多關(guān)于使用約束排除實(shí)現(xiàn)分區(qū)的信息請(qǐng)參閱第 5.11.5 節(jié)。

cursor_tuple_fraction (floating point)

設(shè)置規(guī)劃器對(duì)將被檢索的一個(gè)游標(biāo)的行的比例的估計(jì)。默認(rèn)值是 0.1。更小的值使得規(guī)劃器偏向?yàn)橛螛?biāo)使用快速開始計(jì)劃,它將很快地檢索前幾行但是可能需要很長(zhǎng)時(shí)間來(lái)獲取所有行。更大的值強(qiáng)調(diào)總的估計(jì)時(shí)間。最大設(shè)置為 1.0,游標(biāo)將和普通查詢完全一樣地被規(guī)劃,只考慮總估計(jì)時(shí)間并且不考慮前幾行會(huì)被多快地返回。

from_collapse_limit (integer)

如果生成的FROM列表不超過這么多項(xiàng),規(guī)劃器將把子查詢?nèi)诤系缴蠈硬樵?。較小的值可以減少規(guī)劃時(shí)間,但是可能 會(huì)生成較差的查詢計(jì)劃。默認(rèn)值是 8。詳見第 14.3 節(jié)。

將這個(gè)值設(shè)置為?geqo_threshold?或更大,可能觸發(fā)使用 GEQO 規(guī)劃器,從而產(chǎn)生非最優(yōu)計(jì)劃。見本文中第 19.7.3 節(jié)。

jit (boolean)

決定如果可用(見第 31 章),PostgreSQL是否可以使用JIT編譯。默認(rèn)值是on。

join_collapse_limit (integer)

如果得出的列表中不超過這么多項(xiàng),那么規(guī)劃器將把顯式JOIN(除了FULL JOIN)結(jié)構(gòu)重寫到 FROM項(xiàng)列表中。較小的值可減少規(guī)劃時(shí)間,但是可能會(huì)生成差些的查詢計(jì)劃。

默認(rèn)情況下,這個(gè)變量被設(shè)置成和from_collapse_limit相同, 這樣適合大多數(shù)使用。把它設(shè)置為 1 可避免任何顯式JOIN的重排序。因此查詢中指定的顯式連接順序就是關(guān)系被連接的實(shí)際順序。因?yàn)椴樵円?guī)劃器并不是總能 選取最優(yōu)的連接順序,高級(jí)用戶可以選擇暫時(shí)把這個(gè)變量設(shè)置為 1,然后顯式地指定他們想要的連接順序。更多信息請(qǐng)見第 14.3 節(jié)。

將這個(gè)值設(shè)置為?geqo_threshold?或更大,可能觸發(fā)使用 GEQO 規(guī)劃器,從而產(chǎn)生非最優(yōu)計(jì)劃。見本文中第 19.7.3 節(jié)。

parallel_leader_participation (boolean)

允許領(lǐng)導(dǎo)者進(jìn)程執(zhí)行GatherGather Merge節(jié)點(diǎn)之下的查詢計(jì)劃而不是等待工作者進(jìn)程。默認(rèn)值是on。將這個(gè)值設(shè)置為off會(huì)降低工作者由于領(lǐng)導(dǎo)者讀取元組速度不夠快而被阻塞的可能性,但是要求領(lǐng)導(dǎo)者在產(chǎn)生第一個(gè)元組之前等待工作者進(jìn)程啟動(dòng)。領(lǐng)導(dǎo)者能夠幫助或者阻礙性能的程度取決于計(jì)劃的類型、工作者的數(shù)量以及查詢時(shí)長(zhǎng)。

force_parallel_mode (enum)

允許為測(cè)試目的使用并行查詢,即便是并不期望在性能上得到效益。force_parallel_mode的允許值是off(只在期望改進(jìn)性能時(shí)才使用并行模式)、on(只要查詢被認(rèn)為是安全的,就強(qiáng)制使用并行查詢)以及regress(和on相似,但是有如下文所解釋的額外行為改變)。

更具體地說(shuō),把這個(gè)值設(shè)置為on會(huì)在任何一個(gè)對(duì)于并行查詢安全的查詢計(jì)劃頂端增加一個(gè)Gather節(jié)點(diǎn),這樣查詢會(huì)在一個(gè)并行工作者中運(yùn)行。即便當(dāng)一個(gè)并行工作者不可用或者不能被使用時(shí),諸如開始一個(gè)子事務(wù)等在并行查詢環(huán)境中會(huì)被禁止的操作將會(huì)被禁止,除非規(guī)劃器相信這樣做會(huì)導(dǎo)致查詢失敗。當(dāng)這個(gè)選項(xiàng)被設(shè)置時(shí)如果出現(xiàn)失敗或者意料之外的結(jié)果,查詢使用的某些函數(shù)可能需要被標(biāo)記為PARALLEL UNSAFE(或者可能是 PARALLEL RESTRICTED)。

把這個(gè)值設(shè)置為regress具有設(shè)置成on所有相同的效果,外加一些有助于自動(dòng)回歸測(cè)試的額外的效果。一般來(lái)說(shuō),來(lái)自于一個(gè)并行工作者的消息會(huì)包括一個(gè)上下文行指出這一點(diǎn),但是設(shè)置為regress會(huì)消除這一行,這樣輸出就和非并行執(zhí)行完全一樣。同樣,被這個(gè)設(shè)置加到計(jì)劃上的Gather節(jié)點(diǎn)在 EXPLAIN輸出終會(huì)被隱藏起來(lái),這樣產(chǎn)生的輸出匹配設(shè)置為off時(shí)產(chǎn)生的輸出。

plan_cache_mode (enum)

準(zhǔn)備語(yǔ)句(顯式準(zhǔn)備或隱式生成的,例如 PL/pgSQL)可以使用自定義或通用計(jì)劃執(zhí)行。 使用其特定的參數(shù)值集為每個(gè)執(zhí)行重新生成自定義計(jì)劃,而通用計(jì)劃不依賴于參數(shù)值,并且可以在執(zhí)行中重復(fù)使用。 因此,使用通用計(jì)劃可以節(jié)省計(jì)劃時(shí)間,但如果理想計(jì)劃嚴(yán)重依賴參數(shù)值,則通用計(jì)劃可能效率低下。 這些選項(xiàng)之間的選擇通常是自動(dòng)進(jìn)行的,但可以通過plan_cache_mode覆蓋它。 允許的值為 auto (默認(rèn)的), force_custom_planforce_generic_plan。 這個(gè)設(shè)置是在執(zhí)行緩存計(jì)劃時(shí)考慮,而不是在準(zhǔn)備計(jì)劃時(shí)考慮。 更多信息請(qǐng)參閱 PREPARE.


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)