《PG原始碼學習 6 索引掃瞄成本》

2021-10-03 11:30:51 字數 1827 閱讀 6585

postgres的查詢計畫事基於成本的,成本是乙個相對值,用來定性代價。本文結合**學習基於索引掃瞄的成本計算。

索引包括btree、gist、gin、brin。

序號名稱說明1

啟動成本

讀取第一條元組前花費的成本

2執行成本

獲取全部元組的成本,包括cpu和disk成本

3總成本

啟動成本和執行成本的和

序號名稱說明1

indexstartupcost

索引啟動成本,讀取第一條元組的成本

2indextotalcost

索引掃瞄總成本

3indexselectivity

選擇率0到1,where子句在搜尋範圍的比率

4indexcorrelation

索引順序和表順序之間的相關性(範圍在 -1.0 到 1.0 之間)。這個數值用於調整從父表中抓取行的開銷估計

5index_pages

索引所佔頁面數

6cpu_operator_cost

索引操作的cpu成本,預設0.0025

1)索引啟動成本公式:

indexstartupcost=ceil(log(index->tuples) / log(2.0)) * cpu_operator_cost + (index->tree_height + 1) * 50.0 * cpu_operator_cost

2)索引執行-i/o**

pages_fetched = ceil(indexselectivity * (double) baserel->pages);

min_io_cost += (pages_fetched - 1) * spc_seq_page_cost;

csquared = indexcorrelation * indexcorrelation;

run_cost += max_io_cost + csquared * (min_io_cost - max_io_cost);

3)索引執行-cpu 代價

startup_cost += qpqual_cost.startup;

cpu_per_tuple = cpu_tuple_cost + qpqual_cost.per_tuple;

cpu_run_cost += cpu_per_tuple * tuples_fetched;

1. 常見的btree索引:啟動成本,postgres\src\backend\utils\adt\selfuncs.c

void

btcostestimate(plannerinfo *root

, indexpath *path

, double loop_count,

cost *indexstartupcost

, cost *indextotalcost

, selectivity *indexselectivity

, double *indexcorrelation

, double *indexpages)

2. 執行代價

void

cost_index(indexpath *path

, plannerinfo *root

, double loop_count,

bool partial_path)

索引掃瞄成本評估比較複雜,繼續加油。

《PG原始碼學習 5 全表掃瞄成本》

postgres的查詢計畫事基於成本的,成本是乙個相對值,用來定性代價。本文結合 學習全表掃瞄的成本計算。序號名稱說明1 啟動成本 讀取第一條元組前花費的成本 2執行成本 獲取全部元組的成本,包括cpu和disk成本 3總成本 啟動成本和執行成本的和 序號名稱說明1 spc seq page cos...

FireMonkey 原始碼學習(6)

6 getglyph和getbaseline tfontglyphmanager是乙個抽象類,在不同平台上的實現是不同的,以windows為例,在fmx.fontglyphs.win.pas檔案中定義了 twinfontglyphmanager class tfontglyphmanager pro...

學習筆記 解讀CppUnit原始碼6

看了前面5章的話,就可以了解cppunit大致的結構了。這裡講講一些並不是很核心但卻是不可貨缺的 看看他們雖然學不到優秀的設計知識,但是鞏固一下c 的基礎也不錯。sourceline.h c中關於檔名和 所在的行數有兩個巨集定義 file line 方便在除錯和其他場合輸出。而這個sourcelin...