2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5

60.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,則掃描節點只會生成被掃描關係的 Var;如果設定了該標誌,則掃描節點必須能夠評估這些 Var 上的標量表達式。)可選的 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 的最佳路徑,則規劃器將使用該子句集將其轉換為計劃。

60.1.1. 自定義掃描路徑回撥 #

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

將自定義路徑轉換為最終計劃。返回值通常是一個 CustomScan 物件,回撥必須分配並初始化該物件。有關更多詳細資訊,請參閱 第 60.2 節

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

在將由給定子關係 child_rel 的最頂層父項引數化的路徑轉換為由該子關係引數化時,會呼叫此回撥。該回調用於重新引數化任何路徑或轉換儲存在 CustomPath 的給定 custom_private 成員中的任何表示式節點。回撥可以根據需要使用 reparameterize_path_by_childadjust_appendrel_attrsadjust_appendrel_attrs_multilevel

提交更正

如果您在文件中看到任何不正確、與您對特定功能的實際使用不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。