[Postgres] 規(guī)劃器的代價(jià)估算模型

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í)行路徑也不一定就是總體開銷最小的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,544評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,946評論 25 709
  • 引子 對于一條SQL,開發(fā)同學(xué)最先關(guān)心的啥? 我覺得還不到這個(gè)SQL在數(shù)據(jù)庫的執(zhí)行過程,而是這條SQL是否能盡快的...
    大頭8086閱讀 2,733評論 2 14
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,644評論 18 399
  • 心靈自由寫作第二篇之“自我介紹” 今天的寫作主題是“自我介紹”,回想起對自己的過往介紹,往往是比較簡單,現(xiàn)在一個(gè)人...
    喬大衛(wèi)REIKI閱讀 305評論 3 5

友情鏈接更多精彩內(nèi)容