1. 磁盤
1.1 seq_page_cost
描述:順序磁盤訪問時(shí)單個(gè)頁面的讀取開銷,默認(rèn)為1.0
場景說明:在磁盤關(guān)系型數(shù)據(jù)庫的代價(jià)估算模型中,假定順序訪問磁盤的開銷為1,再給出其他操作的相對開銷。
1.2 random_page_cost
描述:隨機(jī)磁盤訪問時(shí)單個(gè)頁面的讀取開銷,默認(rèn)為4.0
場景說明:默認(rèn)情況下,隨機(jī)IO和順序IO的代價(jià)是4:1的關(guān)系,這主要是針對于傳統(tǒng)的HDD而言的。對于當(dāng)前廣泛使用的SSD,該代價(jià)可能需要調(diào)整。
2. 處理器
2.1 cpu_tuple_cost
描述:處理每個(gè)元組的處理器開銷,默認(rèn)為0.01。對于一個(gè)頁面中的元組,需要解析其中的字段,進(jìn)行投影組裝出新的元組
2.2 cpu_index_tuple_cost
描述:處理每個(gè)索引元組的處理器開銷,默認(rèn)為0.005
2.3 cpu_operator_cost
描述:處理每個(gè)運(yùn)算符或者函數(shù)調(diào)用的處理器開銷,默認(rèn)為0.0025
場景說明:默認(rèn)情況下,順序IO和元組處理的代價(jià)是100:1的關(guān)系,這主要是針對于傳統(tǒng)的HDD和一般的處理器而言的。對于磁陣、SSD等存儲設(shè)備,或者頻率較高的處理器,該代價(jià)比例可能需要調(diào)整。
3. 內(nèi)存、磁盤
3.1 effective_cache_size
描述:在一次索引掃描中可用的文件系統(tǒng)內(nèi)核緩沖區(qū)的有效大小
場景說明:該參數(shù)當(dāng)前只用在估計(jì)索引掃描的磁盤IO開銷,用于計(jì)算一次索引掃描需要訪問的所有頁面在內(nèi)核緩沖區(qū)中已經(jīng)存在的頁面數(shù)。該參數(shù)的值越大,計(jì)算出的索引掃描的開銷也越小。
3.2 work_mem
描述:進(jìn)行內(nèi)部排序操作和哈希操作的工作空間,在開始使用臨時(shí)的磁盤文件之前可用的內(nèi)存大小
場景說明:該參數(shù)會用來估計(jì)排序和哈希操作的磁盤IO開銷,用于計(jì)算一次排序或哈希需要處理的所有數(shù)據(jù)可以緩存在內(nèi)存中的數(shù)據(jù)量。該參數(shù)的值越大,計(jì)算出的排序或哈希的開銷也越小。
4. 統(tǒng)計(jì)信息
4.1 表相關(guān)的統(tǒng)計(jì)信息
描述:數(shù)據(jù)特征:堆表中的頁面數(shù)、元組數(shù),索引中的頁面數(shù),子句選擇率等。ANALYZE操作會收集這些統(tǒng)計(jì)信息,然后把結(jié)果保存到系統(tǒng)表pg_statistic和pg_class里。在系統(tǒng)表pg_statistic中,記錄了每個(gè)表內(nèi)容的統(tǒng)計(jì)信息,如一個(gè)表中某個(gè)字段的平均字節(jié)數(shù)、空值占比等,通過這些信息可以計(jì)算出某個(gè)條件表達(dá)式匹配的記錄數(shù)目。
場景說明:系統(tǒng)中的autovacuum進(jìn)程會周期性地運(yùn)行ANALYZE操作,進(jìn)行統(tǒng)計(jì)信息的收集。 頻繁刪改操作會引起數(shù)據(jù)發(fā)生膨脹,批量插入會使得數(shù)據(jù)量迅速增長,這些情況都會出現(xiàn)統(tǒng)計(jì)信息的變化,最終引起查詢的執(zhí)行計(jì)劃發(fā)生變化,這時(shí)候性能很容易出現(xiàn)突變。
5. 總結(jié)
在查詢的規(guī)劃階段,規(guī)劃器會根據(jù)查詢語法樹創(chuàng)建出所有可能的執(zhí)行路徑,計(jì)算出不同路徑的執(zhí)行開銷,并選擇出總體開銷最小的執(zhí)行路徑。每個(gè)路徑的執(zhí)行開銷就是通過上表的信息計(jì)算出來的,主要包括磁盤IO的開銷、處理器的開銷等。
因?yàn)樯厦娴男畔⒑同F(xiàn)實(shí)情況一般都會存在差別,而且實(shí)際運(yùn)行過程中可能還會存在其他的開銷(如資源的爭用),所以估算出來的開銷不一定非常準(zhǔn)確,最終選擇出來的執(zhí)行路徑也不一定就是總體開銷最小的。