【云圖說(shuō)】第132期 小云妹帶您快速玩轉(zhuǎn)RDS實(shí)例操作(2)——?jiǎng)h除與退訂
1151
2025-03-31
一、代價(jià)
1、基于頁(yè)面的IO基準(zhǔn)代價(jià)
#define DEFAULT_SEQ_PAGE_COST ????????????1. 0
#define DEFAULT_RANDOM_PAGE_COST 4. 0
2、基于元組的CPU基準(zhǔn)代價(jià)
#define DEFAULT_CPU_TUPLE_COST ???????????????0.01
#define DEFAULT_CPU_INDEX_TUPLE COST 0.005
定義 DEFAULT_CPU_TUPLE_COST 來(lái)表示處理一條元組的代價(jià),使用DEFAULT_CPU_INDEX_TUPLE_COST 來(lái)表示處理一條索引元組的代價(jià)。
3、基于表達(dá)是的CPU基準(zhǔn)代價(jià)
#define DEFAULT_CPU_OPERATOR_COST ???0.0025
執(zhí)行計(jì)劃的過(guò)程中,不止處理元組需要消耗 CPU 資源,在投影、約束條件中包含大量的表達(dá)式,對(duì)這些表達(dá)式求值同樣需要消耗 CPU 資源,因此 postgresql 數(shù)據(jù)庫(kù)把表達(dá)式的求值代價(jià)單獨(dú)剝離出來(lái)。使用DEFAULT_CPU_OPERATOR_COST來(lái)作為計(jì)算表達(dá)式代價(jià)的基準(zhǔn)單位,用戶可以通過(guò)調(diào)整 cpu_operator_cost 來(lái)調(diào)整這個(gè)基準(zhǔn)單位。
4、并行查詢產(chǎn)生的基準(zhǔn)代價(jià)
目前, postgresql 數(shù)據(jù)庫(kù)部分支持了并行查詢,因此通常在分布式數(shù)據(jù)庫(kù)系統(tǒng)中才考慮的通信代價(jià)目前 PostgreSQL 數(shù)據(jù)庫(kù)也需要考慮了,因?yàn)?Gather 進(jìn)程和 Worker 進(jìn)程在并行查詢的過(guò)程中需要進(jìn)行通信,因此需要考慮進(jìn)程間通信(IPC)所需的初始化代價(jià)( DEFAULT_PARALLEL_SETUP_COST ),以及 Worker 進(jìn)程向 Gather 進(jìn)程投遞元組的代價(jià)( DEFAULT_PARALLEL_TUPLE_COST )。
#define DEFAULT_PARALLEL_TUPLE_COST ??0.1
#define DEFAULT_PARALLEL_SETUP_COST ??1000.0
double parallel_tuple_cost = DEFAULT_PARALLEL_TUPLE_COST;
double parallel_setup_cost = DEFAULT_PARALLEL_SETUP_COST;
5、緩存對(duì)代價(jià)的影晌
數(shù)據(jù)庫(kù)本身有緩存系統(tǒng),磁盤(pán)上也有磁盤(pán)緩存,當(dāng)讀取一個(gè)緩存中的數(shù)據(jù)頁(yè)面時(shí)是不會(huì)產(chǎn)生磁盤(pán) IO 的,因此,如果對(duì)每個(gè)頁(yè)面都計(jì)算磁盤(pán) IO 的代價(jià),代價(jià)的計(jì)算結(jié)果就會(huì)失真,所以我們還需要對(duì)緩存中的頁(yè)面數(shù)量有一個(gè)估計(jì),目前 PostgreSQL 數(shù)據(jù)庫(kù)用 effective_cache_size參數(shù)來(lái)表示,實(shí)際上這個(gè)值一定是不準(zhǔn)確的,這是 PostgreSQL 數(shù)據(jù)庫(kù)需要改進(jìn)的地方。
#define DEFAULT_EFFECTIVE_CACHE_SIZE 524288
int effective_cache_size = DEFAULT_EFFECTIVE_CACHE_SIZE;
6、啟動(dòng)代價(jià)和整體代價(jià)
PostgreSQL 數(shù)據(jù)庫(kù)將代價(jià)分成了兩個(gè)部分:?jiǎn)?dòng)代價(jià)( Startup Cost )和執(zhí)行代價(jià)( Run Cost), 兩者的和是整體代價(jià)( Total Cost )。
Total Cost= Startup Cost+ Run Cost
在Path 結(jié)構(gòu)體中用 startup_cost 和 total_cost 兩個(gè)變量來(lái)表示啟動(dòng)代價(jià)和整體代價(jià),startup_cost 是指從語(yǔ)句開(kāi)始執(zhí)行到查詢引擎返回第一條元組的代價(jià)(另一種說(shuō)法是準(zhǔn)備好獲得第一條元組的代價(jià)) , total_cost 是SQL 語(yǔ)句從開(kāi)始執(zhí)行到結(jié)束的所有代價(jià)。
7、表達(dá)式代價(jià)的計(jì)算
表達(dá)式代價(jià)的基準(zhǔn)單位是 cpu_operator_cost ,不同的表達(dá)式需要輔以基準(zhǔn)單位進(jìn)行計(jì)算,表達(dá)式代價(jià)主要包括如下方面:
對(duì)投影列的表達(dá)式進(jìn)行計(jì)算產(chǎn)生的代價(jià)
對(duì)約束條件中的表達(dá)式進(jìn)行計(jì)算產(chǎn)生的代價(jià)
.對(duì)函數(shù)參數(shù)中的表達(dá)式進(jìn)行計(jì)算產(chǎn)生的代價(jià)
.對(duì)聚集函數(shù)中的表達(dá)式進(jìn)行計(jì)算產(chǎn)生的代價(jià)。
.子計(jì)劃等執(zhí)行計(jì)算產(chǎn)生的代價(jià)
二、路徑(Path)
邏輯優(yōu)化:
主要是基于 SQL 語(yǔ)句中指定的邏輯運(yùn)算符進(jìn)行等價(jià)的變換 ,
物理優(yōu)化:
在邏輯優(yōu)化的基礎(chǔ)之上建立一棵路徑樹(shù),路徑樹(shù)中的每一個(gè)路徑都是一個(gè)物理算子,這些物理算子是為查詢執(zhí)行器準(zhǔn)備的,查詢執(zhí)行器通過(guò)運(yùn)行這些物理算子來(lái)實(shí)現(xiàn)查詢中的邏輯運(yùn)算,這些物理算子又大體可以分為兩類,它們是掃描路徑和連接路徑。
掃描路徑:
是針對(duì)基表而言的,這些基表就是 RELOPT_BASEREL 類型的 RelOptinfo,這些基表是一個(gè)二維的關(guān)系實(shí)體,掃描路徑就是對(duì)這個(gè)二維的關(guān)系實(shí)體進(jìn)行遍歷的過(guò)程,它包括:順序掃描路徑、 (快速)索引掃描路徑、位圖掃描路徑、 TID掃描路徑等。
連接路徑:
是記錄基表之間的物理連接關(guān)系,我們已經(jīng)將表之間的邏輯連接關(guān)系記錄到了 SpecialJoinlnfo 結(jié)構(gòu)體中,在物理優(yōu)化的階段會(huì)根據(jù)這些邏輯連接關(guān)系建立一個(gè)新的RelOptinfo,然后將基于邏輯連接關(guān)系建立的物理連接路徑記錄到這個(gè) RelOptlnfo 中, 并且邊記錄邊篩選。例如針對(duì) InnerJoin 這樣一個(gè)邏輯連接關(guān)系,查詢優(yōu)化器可以建立 NestloopJoin、HashJoin 等物理連接路徑,這些物理連接路徑都可以實(shí)現(xiàn) InnerJoin 的運(yùn)算,但是它們的路徑代價(jià)是不同的,因此物理優(yōu)化的一個(gè)主要工作就是建立物理連接路徑并且選出代價(jià)最低的物理連接路徑。
--------------------
一、
最優(yōu)的執(zhí)行路徑生成后,雖然 Path Tree 己經(jīng)足夠清楚地指出 查詢計(jì)劃要進(jìn)行的物理操作,但是它的結(jié)構(gòu)體中為了進(jìn)行代價(jià)計(jì)算有太多的冗余信息,不方便查詢執(zhí)行器使用,并且有些參數(shù)還沒(méi)有建立好,因此通過(guò)將其轉(zhuǎn)換成執(zhí)行計(jì)劃來(lái)生成更適合查詢執(zhí)行器的 Plan Tree ,然后將Plan Tree 轉(zhuǎn)交給執(zhí)行器就可以真正執(zhí)行了。
路徑的結(jié)構(gòu)體是 Path 或者是“繼承”自 Path 的新的路徑結(jié)構(gòu)體,例如 JoinPath;對(duì)應(yīng)的執(zhí)行計(jì)劃節(jié)點(diǎn)的結(jié)構(gòu)體是 Plan 或者是“繼承”自 Plan 新的執(zhí)行計(jì)劃節(jié)點(diǎn),例如 Join 結(jié)構(gòu)體。
PostgreSQL 數(shù)據(jù)庫(kù)的每個(gè) Path 節(jié)點(diǎn)都一一對(duì)應(yīng)一個(gè) Plan 節(jié)點(diǎn),最優(yōu)的執(zhí)行路徑需要通過(guò) create_plan 函數(shù)轉(zhuǎn)換成對(duì)應(yīng)的執(zhí)行計(jì)劃。
物理優(yōu)化階段己經(jīng)選出了 代價(jià)最低的最優(yōu)路徑,這里通過(guò) create_plan 函數(shù)將其中的 Path節(jié)點(diǎn)一一轉(zhuǎn)換成為 Plan 節(jié)點(diǎn),轉(zhuǎn)換的過(guò)程如圖 10-2 所示。
二、掃描計(jì)劃
物化路徑要求保持最小的投影結(jié)果( CP_SMALL_TLIST ),在 create_plan 函數(shù)遍歷最優(yōu)路徑中的各個(gè)節(jié)點(diǎn)的過(guò)程中,如果發(fā)現(xiàn)諸如 Hash 、Sort、 Materia 之類的節(jié)點(diǎn),會(huì)設(shè)置 CP_SMALL_TLIST 標(biāo)志,這樣下層路徑就不會(huì)隨便擴(kuò)展投影列了,因?yàn)檫@時(shí)候擴(kuò)展投影列會(huì)帶來(lái)無(wú)謂的代價(jià)消耗。
在生成掃描路徑時(shí), 路徑節(jié)點(diǎn)( Path )都要轉(zhuǎn)換成新的計(jì)劃節(jié)點(diǎn)( Plan), 在分別轉(zhuǎn)換每個(gè)路徑之前,所有的掃描節(jié)點(diǎn)有一些公共的事情要處理,于是通過(guò) creat_scan _plan 函數(shù)先處理所有掃描路徑轉(zhuǎn)換過(guò)程中的公共部分。
create_scan_plan 函數(shù)處理了所有掃描路徑公共的特性之后,開(kāi)始單獨(dú)處理每個(gè)掃描路徑向掃描計(jì)劃的轉(zhuǎn)換。
掃描節(jié)點(diǎn)上只有過(guò)濾條件,這些過(guò)濾條件可 通過(guò) RelOptlnfo->baserestrictinfo來(lái)獲得,但是索引掃描例外,索引結(jié)構(gòu)體 IndexOptlnfo 中通過(guò) indrestrictinfo 也保存了一份過(guò)濾條件, indrestrictinfo 通常和 baserestrictinfo 相同, 但是對(duì)于帶有謂詞的局部索引, indrestrictinfo通常和baserestrictinfo 可能是不同的。
1、順序執(zhí)行計(jì)劃
PostgreSQL SQL 數(shù)據(jù)庫(kù)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。