?
本文檔使用 PHP中文網(wǎng)手冊(cè) 發(fā)布
這些配置參數(shù)提供了影響查詢優(yōu)化器選擇查詢規(guī)劃的原始方法。如果優(yōu)化器 為特定的查詢選擇的缺省規(guī)劃并不是最優(yōu),那么我們就可以通過使用這些 配置參數(shù)強(qiáng)制優(yōu)化器選擇一個(gè)更好的規(guī)劃來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ì)信息。
打開或者關(guān)閉規(guī)劃器對(duì)位圖掃描規(guī)劃類型的使用。缺省是on
打開或者關(guān)閉規(guī)劃器對(duì)Hash聚集規(guī)劃類型的使用。缺省是on
打開或者關(guān)閉規(guī)劃器對(duì)Hash連接規(guī)劃類型的使用。缺省是on
打開或者關(guān)閉規(guī)劃器對(duì)索引掃描規(guī)劃類型的使用。缺省是on
啟用或禁用查詢規(guī)劃器的具體化的使用。它可以完全廢止具體化, 但禁用該變量后悔阻止規(guī)劃器插入具體節(jié)點(diǎn),除非是要求得正確得當(dāng)。 缺省是on。
打開或者關(guān)閉規(guī)劃器對(duì)融合連接規(guī)劃類型的使用。缺省是 on
打開或者關(guān)閉規(guī)劃器對(duì)嵌套循環(huán)連接規(guī)劃類型的使用。我們不可能完全 消除嵌套循環(huán)連接,但是把這個(gè)變量關(guān)閉就會(huì)讓規(guī)劃器在存在其它方法的 時(shí)候優(yōu)先選擇其它方法。缺省是on.
打開或者關(guān)閉規(guī)劃器對(duì)順序掃描規(guī)劃類型的使用。我們不可能完全消除 順序掃描,但是把這個(gè)變量關(guān)閉會(huì)讓規(guī)劃器在存在其它方法的時(shí)候優(yōu)先 選擇其它方法。缺省是on.
打開或者關(guān)閉規(guī)劃器使用明確的排序步驟。我們不可能完全消除明確的排序, 但是把這個(gè)變量關(guān)閉可以讓規(guī)劃器在存在其它方法的時(shí)候優(yōu)先選擇其它方法。 缺省是on
打開或者關(guān)閉規(guī)劃器對(duì) TID 掃描規(guī)劃類型的使用。缺省是on.
本節(jié)中描述的cost可以按照任意標(biāo)準(zhǔn)度量。我們只關(guān)心其相對(duì)值, 因此以相同的系數(shù)縮放它們將不會(huì)對(duì)規(guī)劃器產(chǎn)生任何影響。默認(rèn)情況下,它們 以抓取順序頁的開銷作為基準(zhǔn)單位。也就是說將seq_page_cost 設(shè)為 1.0 ,同時(shí)其它開銷參數(shù)對(duì)照它來設(shè)置。當(dāng)然你也可以使用其它基準(zhǔn), 比如以毫秒計(jì)的實(shí)際執(zhí)行時(shí)間。
Note: 糟糕的是,現(xiàn)在還沒有定義得很合理的方法來判斷下面出現(xiàn)的"開銷"變量族的 理想數(shù)值。它們最好按照某個(gè)特定安裝的平均查詢開銷來衡量。這意味著僅僅 根據(jù)很少量的試驗(yàn)結(jié)果來修改它們是很危險(xiǎn)的。
設(shè)置規(guī)劃器計(jì)算一次順序磁盤頁面抓取的開銷。默認(rèn)值是1.0。 通過設(shè)置同名的表空間參數(shù),這個(gè)值可以重寫為一個(gè)特定的表空間。 參閱ALTER TABLESPACE。
設(shè)置規(guī)劃器計(jì)算一次非順序磁盤頁面抓取的開銷。默認(rèn)值是4.0。 通過設(shè)置同名的表空間參數(shù),這個(gè)值可以重寫為一個(gè)特定的表空間。 參閱ALTER TABLESPACE。
(相對(duì)于seq_page_cost)減少這個(gè)值將導(dǎo)致更傾向于使用 索引掃描,而增加這個(gè)值將導(dǎo)致更傾向于使用順序掃描??梢酝ㄟ^同時(shí) 增加或減少這兩個(gè)值來調(diào)整磁盤I/O相對(duì)于CPU的開銷(在下面的參數(shù) 中描述)。
Tip: 雖然允許你將random_page_cost設(shè)置的比 seq_page_cost小,但是物理上的實(shí)際情況并不受此影響。 然而當(dāng)所有數(shù)據(jù)庫都位于內(nèi)存中時(shí),兩者設(shè)置為相等是非常合理的,因?yàn)? 在此情況下,亂序抓取并不比順序抓取開銷更大。同樣,在緩沖率很高的 數(shù)據(jù)庫上,你應(yīng)當(dāng)相對(duì)于 CPU 開銷同時(shí)降低這兩個(gè)值,因?yàn)楂@取內(nèi)存中 的頁比通常情況下的開銷小許多。
設(shè)置規(guī)劃器計(jì)算在一次查詢中處理一個(gè)數(shù)據(jù)行的開銷。缺省是 0.01 。
設(shè)置規(guī)劃器計(jì)算在一次索引掃描中處理每條索引行的開銷。缺省是 0.005 。
設(shè)置規(guī)劃器計(jì)算在一次查詢中執(zhí)行一個(gè)操作符或函數(shù)的開銷。缺省是 0.0025 。
為規(guī)劃器設(shè)置在一次索引掃描中可用的磁盤緩沖區(qū)的有效大小。 這個(gè)參數(shù)會(huì)在計(jì)算一個(gè)索引的預(yù)計(jì)開銷值的時(shí)候加以考慮。更高的數(shù)值 會(huì)導(dǎo)致更可能使用索引掃描,更低的數(shù)值會(huì)導(dǎo)致更有可能選擇順序掃描。 在設(shè)置這個(gè)參數(shù)的時(shí)候,你還應(yīng)該考慮PostgreSQL 的數(shù)據(jù)文件會(huì)使用的共享緩沖區(qū)和內(nèi)核的磁盤緩沖區(qū)。另外,還要考慮 預(yù)計(jì)會(huì)使用不同索引的并發(fā)查詢數(shù)目,因?yàn)樗鼈儽仨毠蚕砜捎玫膬?nèi)存空間。 這個(gè)參數(shù)對(duì)PostgreSQL分配的共享內(nèi)存 大小沒有影響,它也不會(huì)使用內(nèi)核磁盤緩沖,它只用于估算。數(shù)值是用 磁盤頁來計(jì)算的,通常每個(gè)頁面是 8192 字節(jié)。缺省是 16384 (128MB)。
GEQO是一個(gè)使用探索式搜索來執(zhí)行查詢規(guī)劃的算法。它可以降低負(fù)載查詢的規(guī)劃時(shí)間。 同時(shí),GEQO的檢索是隨機(jī)的,因此它的規(guī)劃可能會(huì)不可確定。 更多信息參閱Chapter 50。
允許或禁止基因查詢優(yōu)化,通常情況下最好不要把它應(yīng)用于生產(chǎn), 缺省是允許。geqo_threshold 變量提供了一種為特定類別的 查詢關(guān)閉 GEQO 的更精細(xì)方法。
只有當(dāng)涉及的FROM關(guān)系數(shù)量至少有這么多個(gè)的時(shí)候, 才使用基因查詢優(yōu)化。對(duì)于數(shù)量小于此值的查詢,也許使用判定性的 窮舉搜索更有效。但是對(duì)于有許多表的查詢,規(guī)劃器做判斷要花很多時(shí)間。 缺省是12。請(qǐng)注意一個(gè)FULL OUTER JOIN構(gòu)造只算一個(gè) FROM項(xiàng)。
控制 GEQO 里規(guī)劃時(shí)間和查詢規(guī)劃的有效性之間的平衡。這個(gè)變量必須是 一個(gè)范圍從 1 到 10 的整數(shù)。缺省值是 5 。大的數(shù)值增加花在進(jìn)行查詢 規(guī)劃上面的時(shí)間,但是也很可能會(huì)提高選中更有效的查詢規(guī)劃的幾率。
geqo_effort實(shí)際上并沒有直接干什么事情; 只是用于計(jì)算其它那些影響 GEQO 行為變量的缺省值(在下面描述)。 如果你愿意,你可以手工設(shè)置其它參數(shù)。
控制 GEQO 使用的池大小。池大小是基因全體中的個(gè)體數(shù)量。它必須至少 是 2 ,并且有用的數(shù)值通常在 100 和 1000 之間。如果把它設(shè)置為 零(缺省),那么就會(huì)基于geqo_effort和查詢中表的 數(shù)量選取一個(gè)合適的值。
控制 GEQO 使用的子代數(shù)目。子代的意思是算法的迭代次數(shù)。它必須至少 是 1 ,有用的值范圍和池大小相同。如果設(shè)置為零(缺省),那么將基于 geqo_pool_size選取合適的值。
控制GEQO使用的選擇性偏好。選擇性偏好是在一個(gè)種群中的選擇性壓力。 數(shù)值可以是1.5到2.0之間;缺省是2.0。
控制GEQO使用的隨機(jī)數(shù)產(chǎn)生器的初始值,用以選擇隨機(jī)路徑。 這個(gè)值可以從0(缺?。┑?。修改這個(gè)值會(huì)改變連接路徑搜索的設(shè)置, 同時(shí)會(huì)找到最優(yōu)或最差路徑。
為沒有用ALTER TABLE SET STATISTICS設(shè)置字段相關(guān)目標(biāo)的 表中其它字段設(shè)置缺省統(tǒng)計(jì)目標(biāo)。更大的數(shù)值增加了ANALYZE 所需要的時(shí)間,但是可能會(huì)改善規(guī)劃器的估計(jì)質(zhì)量。缺省值是 100 。 有關(guān)PostgreSQL的查詢規(guī)劃器使用的統(tǒng)計(jì)的更多信息, 請(qǐng)參考節(jié)Section 14.2。
控制使用表約束的查詢規(guī)劃的優(yōu)化查詢。 The allowed values ofconstraint_exclusionare on(examine constraints for all tables), off(never examine constraints), and partition(examine constraints only for inheritance child tables andUNION ALLsubqueries). partitionis the default setting. It is often used with inheritance and partitioned tables to improve performance.
如果這個(gè)參數(shù)支持一個(gè)特定的表 ,那么規(guī)劃器用查詢條件和 CHECK約束進(jìn)行比較,并且在查詢條件和約束沖突的情況下, 忽略對(duì)表的掃描。比如:
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。這樣可以在使用繼承制作分區(qū)表的時(shí)候提高性能。
目前,約束排除在缺省啟用,只用于經(jīng)常進(jìn)行表分區(qū)的情況。 為所有表啟用約束排除會(huì)明顯增加規(guī)劃開銷,特別是在一個(gè)簡單查詢時(shí), 對(duì)簡單查詢而言,頻繁的約束排除不會(huì)產(chǎn)生任何好處。 如果沒有分區(qū)表時(shí),最好是完全關(guān)閉該選項(xiàng)。
參閱Section 5.9.4以獲得更多信息。
設(shè)置游標(biāo)將被檢索的行的分?jǐn)?shù)的規(guī)劃估計(jì)。缺省是0.1。小于該值時(shí)會(huì)為游標(biāo)偏向使用 "fast start"規(guī)劃,這將快速檢索前幾行,雖然可能花費(fèi)很長的時(shí)間讀取所有行。 大于該值時(shí)會(huì)更重視總體的估計(jì)時(shí)間。最大可設(shè)置為1.0,此時(shí)游標(biāo)會(huì)被規(guī)劃為類似于定期查詢, 只考慮總估算時(shí)間,而不考慮多久才會(huì)輸出第一個(gè)行。
如果生成的FROM列表不超過這個(gè)限制的項(xiàng)數(shù), 規(guī)劃器將把子查詢?nèi)诤系缴蠈硬樵儭P〉臄?shù)值降低規(guī)劃的時(shí)間,但是可能 會(huì)生成差些的查詢計(jì)劃。缺省是 8 。更多信息請(qǐng)查看節(jié)13.3。
將這個(gè)值設(shè)置為geqo_threshold或更大,可能觸發(fā) 使用GEQO規(guī)劃器,從而產(chǎn)生不確定的計(jì)劃。 參閱Section 18.6.3。
如果得出的列表不超過這個(gè)數(shù)目的項(xiàng),那么規(guī)劃器將把除 FULL JOIN之外的JOIN構(gòu)造抹平到 FROM列表項(xiàng)中。小的數(shù)值降低規(guī)劃的時(shí)間,但是可能會(huì)生成 差些的查詢計(jì)劃。
缺省時(shí),這個(gè)值和from_collapse_limit相同, 這樣適合大多數(shù)場合。把它設(shè)置為 1 則避免任何JOIN 的融合,這樣就將明確使用語句中的連接順序。查詢優(yōu)化器并不是總能 選取最優(yōu)的連接順序;高級(jí)用戶可以選擇暫時(shí)把這個(gè)變量設(shè)置為 1 , 然后明確地聲明他們需要的連接順序。 更多信息參見節(jié)Section 14.3。
將這個(gè)值設(shè)置為geqo_threshold或更大,可能觸發(fā) 使用GEQO規(guī)劃器,從而產(chǎn)生不確定的計(jì)劃。參閱Section 18.6.3。