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...