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

71.3. 可擴充性 #

BRIN 介面具有高度抽象性,只要求存取方法實作者實作正在存取資料類型的語意。BRIN 層本身會處理並行性、記錄和搜尋索引結構。

BRIN 存取方法運作只須實作幾個使用者定義的方法,這些方法會定義儲存在索引中的摘要值的行為,以及它們與掃描金鑰互動的方式。簡而言之,BRIN 將可擴充性與通用性、程式碼重複使用和乾淨的介面結合在一起。

BRIN 的運算子類別必須提供四種方法

BrinOpcInfo *opcInfo(Oid type_oid)

傳回索引欄摘要資料的內部資訊。傳回值必須指向已 palloc 的 BrinOpcInfo,其定義如下

typedef struct BrinOpcInfo
{
    /* Number of columns stored in an index column of this opclass */
    uint16      oi_nstored;

    /* Opaque pointer for the opclass' private use */
    void       *oi_opaque;

    /* Type cache entries of the stored columns */
    TypeCacheEntry *oi_typcache[FLEXIBLE_ARRAY_MEMBER];
} BrinOpcInfo;

BrinOpcInfo.oi_opaque 可供運算子類別常式在索引掃描期間,於支援函式之間傳遞資訊。

bool consistent(BrinDesc *bdesc, BrinValues *column, ScanKey *keys, int nkeys)

傳回所有 ScanKey 項目是否與範圍的指定索引值一致。要使用的屬性編號會作為掃描金鑰的一部分傳遞。可以一次傳遞同一個屬性的多個掃描金鑰;項目數量由 nkeys 參數決定。

bool consistent(BrinDesc *bdesc, BrinValues *column, ScanKey key)

傳回 ScanKey 是否與範圍的指定索引值一致。要使用的屬性編號會作為掃描金鑰的一部分傳遞。這是 consistent 函式的舊版後向相容變體。

bool addValue(BrinDesc *bdesc, BrinValues *column, Datum newval, bool isnull)

針對索引元組和索引值,修改元組的指定屬性,使其額外代表新值。如果對元組進行任何修改,則傳回 true

bool unionTuples(BrinDesc *bdesc, BrinValues *a, BrinValues *b)

合併兩個索引元組。針對兩個索引元組,修改第一個元組的指定屬性,使其代表兩個元組。第二個元組不會被修改。

BRIN 的運算子類別可以選擇指定下列方法

void options(local_relopts *relopts)

定義一組使用者可見的參數,用來控制運算子類別行為。

options 函式傳遞一個 local_relopts 結構的指標,需要填入一組運算子類別特定的選項。可以使用 PG_HAS_OPCLASS_OPTIONS()PG_GET_OPCLASS_OPTIONS() 巨集,從其他支援函式存取這些選項。

由於索引值的關鍵字萃取和 BRIN 中關鍵字的表示方式都很彈性,因此它們可能會依賴使用者指定的參數。

核心發行版包含對四種類型的運算子類別提供支援:minmax、minmax-multi、inclusion 和 bloom。使用這些類別的運算子類別定義會適當地運送給內核資料類型。使用者可以針對其他資料類型,使用等效定義來定義其他運算子類別,而無需撰寫任何原始碼;只要宣告適當的目錄項目即可。請注意,運算子策略語意的假設會內嵌在支援函式的原始碼中。

也可以使用完全不同語意的運算子類別,只要撰寫上述四個主要支援函式的實作即可。請注意,不保證主要版本間的後向相容性:例如,後續版本可能需要其他支援函式。

若要為實作完全排序集合的資料類型撰寫運算子類別,可以使用 minmax 支援函式與對應運算子,如 表 71.2 所示。所有運算子類別成員(函式和運算子)均為強制性。

表 71.2。Minmax 運算子類別的函式和支援號碼

運算子類別成員 物件
支援函式 1 內部函式 brin_minmax_opcinfo()
支援函式 2 內部函式 brin_minmax_add_value()
支援函式 3 內部函式 brin_minmax_consistent()
支援函式 4 內部函式 brin_minmax_union()
運算子策略 1 運算子小於
運算子策略 2 運算子小於或等於
運算子策略 3 運算子等於
運算子策略 4 運算子大於或等於
運算子策略 5 運算子大於

若要為包含在另一類型中的值的複雜資料類型撰寫運算子類別,可以使用包含支援函式與對應運算子,如 表 71.3 所示。它只需要一個額外的函式,可以用任何語言撰寫。可以定義更多函式以提供額外功能。所有運算子均為選用。某些運算子需要其他運算子,如表格中的相依性所示。

表 71.3。包含運算子類別的函式和支援號碼

運算子類別成員 物件 相依性
支援函式 1 內部函式 brin_inclusion_opcinfo()  
支援函式 2 內部函式 brin_inclusion_add_value()  
支援函式 3 內部函式 brin_inclusion_consistent()  
支援函式 4 內部函式 brin_inclusion_union()  
支援函式 11 合併兩個元素的函式  
支援函式 12 檢查兩個元素是否可合併的選用函式  
支援函式 13 檢查一個元素是否包含在另一個元素中的選用函式  
支援函式 14 檢查一個元素是否為空的選用函式  
運算子策略 1 運算子左邊 運算子策略 4
運算子策略 2 運算子不延伸到右邊 運算子策略 5
運算子策略 3 運算子重疊  
運算子策略 4 運算子不延伸到左邊 運算子策略 1
運算子策略 5 運算子右邊 運算子策略 2
運算子策略 6、18 運算子相同或等於 操作員策略 7
操作員策略 7、16、24、25 操作員 contains-or-equal-to  
操作員策略 8、26、27 操作員 is-contained-by-or-equal-to 運算子策略 3
操作員策略 9 操作員 does-not-extend-above 操作員策略 11
操作員策略 10 操作員 is-below 操作員策略 12
操作員策略 11 操作員 is-above 操作員策略 9
操作員策略 12 操作員 does-not-extend-below 操作員策略 10
操作員策略 20 運算子小於 運算子策略 5
操作員策略 21 運算子小於或等於 運算子策略 5
操作員策略 22 運算子大於 運算子策略 1
操作員策略 23 運算子大於或等於 運算子策略 1

支援函數編號 1 到 10 保留給 BRIN 內部函數,因此 SQL 層級函數從編號 11 開始。支援函數編號 11 是建構索引所需的主要函數。它應該接受兩個與操作員類別相同資料類型的引數,並傳回它們的聯集。如果包含操作員類別使用 STORAGE 參數定義,它可以儲存具有不同資料類型的聯集值。聯集函數的傳回值應該與 STORAGE 資料類型相符。

提供支援函數編號 12 和 14 以支援內建資料類型的異常。函數編號 12 用於支援來自不同家族且無法合併的網路位址。函數編號 14 用於支援空範圍。函數編號 13 是選用的,但建議使用,它允許在將新值傳遞給聯集函數之前檢查新值。由於 BRIN 架構可以在聯集未變更時捷徑執行一些作業,因此使用此函數可以改善索引效能。

若要為僅實作等號操作員且支援雜湊的資料類型撰寫操作員類別,可以在對應的操作員旁邊使用 Bloom 支援程序,如 表 71.4 所示。所有操作員類別成員(程序和操作員)都是強制性的。

表 71.4。Bloom 操作員類別的程序和支援編號

運算子類別成員 物件
支援程序 1 內部函數 brin_bloom_opcinfo()
支援程序 2 內部函數 brin_bloom_add_value()
支援程序 3 內部函數 brin_bloom_consistent()
支援程序 4 內部函數 brin_bloom_union()
支援程序 5 內部函數 brin_bloom_options()
支援程序 11 用於計算元素雜湊的函數
運算子策略 1 運算子等於

支援程序編號 1-10 保留給 BRIN 內部函數,因此 SQL 層級函數從編號 11 開始。支援函數編號 11 是建置索引所需的主要函數。它應該接受一個與運算子類別相同資料類型的引數,並傳回值的雜湊。

minmax-multi 運算子類別也適用於實作完全排序集合的資料類型,且可視為 minmax 運算子類別的簡單延伸。雖然 minmax 運算子類別會將每個區塊範圍中的值摘要成單一連續區間,但 minmax-multi 允許摘要成多個較小的區間,以改善異常值的處理。您可以將 minmax-multi 支援程序與對應的運算子一起使用,如 表 71.5 所示。所有運算子類別成員(程序和運算子)都是強制性的。

表 71.5。minmax-multi 運算子類別的程序和支援編號

運算子類別成員 物件
支援程序 1 內部函數 brin_minmax_multi_opcinfo()
支援程序 2 內部函數 brin_minmax_multi_add_value()
支援程序 3 內部函數 brin_minmax_multi_consistent()
支援程序 4 內部函數 brin_minmax_multi_union()
支援程序 5 內部函數 brin_minmax_multi_options()
支援程序 11 用於計算兩個值之間距離(範圍長度)的函數
運算子策略 1 運算子小於
運算子策略 2 運算子小於或等於
運算子策略 3 運算子等於
運算子策略 4 運算子大於或等於
運算子策略 5 運算子大於

minmax 和包含運算子類別都支援跨資料型別運算子,儘管如此,這些依賴關係會變得更為複雜。minmax 運算子類別需要定義一組完整的運算子,且兩項引數具有相同的資料型別。它允許透過定義額外的運算子組來支援其他資料型別。包含運算子類別運算子策略依賴於另一個運算子策略,如 表 71.3 所示,或與它們相同的運算子策略。它們要求依賴運算子定義為 STORAGE 資料型別作為左側引數,而其他支援的資料型別為支援的運算子的右側引數。請參閱 float4_minmax_ops 作為 minmax 的範例,以及 box_inclusion_ops 作為包含的範例。

提交更正

如果您在文件中看到任何不正確、與您對特定功能的體驗不符或需要進一步說明的地方,請使用 此表單 報告文件問題。