支援的版本: 目前版本 (17) / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5

59.1. 建立自訂掃描路徑 #

自訂掃描供應器通常會透過設定以下掛鉤來為基礎關聯新增路徑,此掛鉤會在核心程式碼為關聯產生所有可用的存取路徑後呼叫(除了 Gather 和 Gather Merge 路徑,它們會在呼叫此掛鉤後建立,以便它們可以使用掛鉤新增的部分路徑)

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;

雖然此掛鉤函式可用於檢查、修改或移除核心系統產生的路徑,但自訂掃描供應器通常會將自己限制為產生 CustomPath 物件,並使用 add_pathadd_partial_path(如果是部分路徑)將它們新增至 rel。自訂掃描供應器負責初始化 CustomPath 物件,該物件的宣告如下

typedef struct CustomPath
{
    Path      path;
    uint32    flags;
    List     *custom_paths;
    List     *custom_restrictinfo;
    List     *custom_private;
    const CustomPathMethods *methods;
} CustomPath;

path 必須像其他任何路徑一樣進行初始化,包括列數估計、開始和總成本,以及此路徑提供的排序。 flags 是一個位元遮罩,用於指定掃描供應器是否支援某些選用功能。如果自訂路徑支援向後掃描,flags 應包含 CUSTOMPATH_SUPPORT_BACKWARD_SCAN;如果它支援標記和還原,則包含 CUSTOMPATH_SUPPORT_MARK_RESTORE;如果它可以執行投影,則包含 CUSTOMPATH_SUPPORT_PROJECTION。(如果未設定 CUSTOMPATH_SUPPORT_PROJECTION,則只會要求掃描節點產生掃描關聯的 Vars;如果設定了該旗標,則掃描節點必須能夠評估這些 Vars 上的純量表達式。)選用的 custom_paths 是此自訂路徑節點使用的 Path 節點清單;這些節點將由規劃器轉換為 Plan 節點。如下所述,也可以為聯結關聯建立自訂路徑。在這種情況下,custom_restrictinfo 應用於儲存要應用於自訂路徑取代的聯結的聯結子句集。否則,它應為 NIL。 custom_private 可用於儲存自訂路徑的私有資料。私有資料應以可以由 nodeToString 處理的形式儲存,以便嘗試列印自訂路徑的偵錯常式可以按設計工作。 methods 必須指向實作所需自訂路徑方法的物件(通常是靜態配置的),這些方法將在下文中詳細說明。

自訂掃描供應器也可以提供聯結路徑。與基礎關聯一樣,此類路徑必須產生與其取代的聯結通常產生的相同輸出。為此,聯結供應器應設定以下掛鉤,然後在掛鉤函式中,為聯結關聯建立 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;

對於相同的聯結關聯,將會重複呼叫此掛鉤,並使用不同的內部和外部關聯組合;掛鉤有責任將重複的工作量降至最低。

另請注意,要應用於聯結的聯結子句集(以 extra->restrictlist 傳遞)會因內部和外部關聯的組合而異。為 joinrel 產生的 CustomPath 路徑必須包含它使用的聯結子句集,如果規劃器選擇它作為 joinrel 的最佳路徑,規劃器將使用這些聯結子句將 CustomPath 路徑轉換為計畫。

59.1.1. 自訂掃描路徑回呼 #

Plan *(*PlanCustomPath) (PlannerInfo *root,
                         RelOptInfo *rel,
                         CustomPath *best_path,
                         List *tlist,
                         List *clauses,
                         List *custom_plans);

將自訂路徑轉換為完成的計畫。傳回值通常會是 CustomScan 物件,回呼必須配置並初始化該物件。請參閱 第 59.2 節 以取得更多詳細資訊。

List *(*ReparameterizeCustomPathByChild) (PlannerInfo *root,
                                          List *custom_private,
                                          RelOptInfo *child_rel);

在將給定子關聯 child_rel 的最上層父項參數化的路徑轉換為由子關聯參數化時,會呼叫此回呼。此回呼用於重新參數化給定 CustomPathcustom_private 成員中儲存的任何路徑或轉換任何表達式節點。回呼可以根據需要使用 reparameterize_path_by_childadjust_appendrel_attrsadjust_appendrel_attrs_multilevel

提交更正

如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用 此表單 來回報文件問題。