W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
一個自定義掃描提供者將通過設(shè)置下面的鉤子函數(shù)來為基本關(guān)系增加路徑, 在核心代碼已經(jīng)為該關(guān)系產(chǎn)生了所有訪問路徑集后(除了在此調(diào)用之后生成的Gather路徑,以便它們可以使用被鉤子添加的部分路徑),這個鉤子函數(shù)將被調(diào)用。
typedef void (*set_rel_pathlist_hook_type) (PlannerInfo *root,
RelOptInfo *rel,
Index rti,
RangeTblEntry *rte);
extern PGDLLIMPORT set_rel_pathlist_hook_type set_rel_pathlist_hook;
盡管這個鉤子函數(shù)可被用來檢查、修改或者移除核心系統(tǒng)產(chǎn)生的路徑,自定義掃描提供程序通常還是局限于產(chǎn)生CustomPath
對象并且使用add_path
把它們加入到rel
中。自定義掃描提供者負(fù)責(zé)初始化CustomPath
對象,它被聲明為這樣:
typedef struct CustomPath { Path path; uint32 flags; List *custom_paths; List *custom_private; const CustomPathMethods *methods; } CustomPath;
path
必須像任何其他路徑一樣被初始化,包括行計數(shù)估計、啟動和總代價以及這條路徑提供的排序順序。flags
是一個位掩碼,如果該自定義路徑能夠支持反向掃描則它應(yīng)該包括CUSTOMPATH_SUPPORT_BACKWARD_SCAN
,如果支持標(biāo)記和恢復(fù)則應(yīng)該包括CUSTOMPATH_SUPPORT_MARK_RESTORE
。這兩種能力都是可選的??蛇x的
custom_paths
域是由這個自定義路徑節(jié)點(diǎn)使用的Path
節(jié)點(diǎn)的列表,這些將被規(guī)劃器轉(zhuǎn)換成Plan
節(jié)點(diǎn)。custom_private
可被用來存儲該自定義路徑的私有數(shù)據(jù)。私有數(shù)據(jù)應(yīng)該被存儲為能被nodeToString
處理的形式,這樣嘗試打印該自定義路徑的調(diào)試?yán)滩拍苷5毓ぷ鳌? methods
必須指向一個實現(xiàn)了所需自定義路徑方法的對象(通常是靜態(tài)分配的),當(dāng)前只有一種方法。
一個自定義掃描提供者還能提供連接路徑。就和基本關(guān)系一樣,這樣一條路徑也應(yīng)該產(chǎn)生和它將要替換的連接所產(chǎn)生的相同的輸出。要做到這一點(diǎn),連接提供程序應(yīng)該設(shè)置下面的鉤子函數(shù),并且在該鉤子函數(shù)里為連接關(guān)系創(chuàng)建CustomPath
路徑。
typedef void (*set_join_pathlist_hook_type) (PlannerInfo *root,
RelOptInfo *joinrel,
RelOptInfo *outerrel,
RelOptInfo *innerrel,
JoinType jointype,
JoinPathExtraData *extra);
extern PGDLLIMPORT set_join_pathlist_hook_type set_join_pathlist_hook;
對于同一個連接關(guān)系,這個鉤子將被反復(fù)調(diào)用,因為要對不同的內(nèi)外關(guān)系組合生成路徑,所以如何最小化可能的重復(fù)工作是鉤子函數(shù)的責(zé)任。
Plan *(*PlanCustomPath) (PlannerInfo *root,
RelOptInfo *rel,
CustomPath *best_path,
List *tlist,
List *clauses,
List *custom_plans);
將一條自定義路徑轉(zhuǎn)換為一個完成的計劃。返回值通常將是一個CustomScan
對象,回調(diào)函數(shù)必須負(fù)責(zé)分配并且初始化這個對象。詳見第 58.2 節(jié)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: