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

69.4. 實作 #

本節涵蓋實作細節和其他技巧,對於實作 SP-GiST 算子類別的實作者來說很有用。

69.4.1. SP-GiST 限制 #

個別葉元組和內部元組必須符合單一索引頁面(預設為 8kB)。因此,在索引變長資料類型值時,長值只能透過基數樹等方法支援,其中樹的每個層級都包含一個前綴,而該前綴短到足以符合一個頁面,而最後的葉層級包含一個後綴,也短到足以符合一個頁面。運算子類別應將 longValuesOK 設為 true,僅當它準備好安排這件事發生時。否則,SP-GiST 核心會拒絕任何索引一個太大而無法符合索引頁面的值的請求。

同樣地,內部元組不會長到太大而無法符合索引頁面,這是運算子類別的責任;這會限制一個內部元組中可使用的子節點數,以及前綴值的最大大小。

另一個限制是,當一個內部元組的節點指向一組葉元組時,那些元組都必須在同一個索引頁面中。(這是為了減少尋找並節省將這些元組串連在一起的連結的空間而做出的設計決策。)如果葉元組的組長到無法符合一個頁面,則會執行分割,並插入一個中間內部元組。為了解決這個問題,新的內部元組必須將葉值組分割成多個節點群組。如果運算子類別的 picksplit 函式無法做到這一點,SP-GiST 核心會訴諸第 69.4.3 節中所述的非常措施。

longValuesOK 為 true 時,預期 SP-GiST 樹的後續層級會將越來越多的資訊吸收進內部元組的前綴和節點標籤中,使所需的葉資料越來越小,最後它會符合一個頁面。為了防止運算子類別中的錯誤造成無限插入迴圈,如果葉資料在十個 choose 方法呼叫週期內沒有變小,SP-GiST 核心會引發錯誤。

69.4.2. 沒有節點標籤的 SP-GiST #

一些樹狀演算法對每個內部元組使用一組固定的節點;例如,在四叉樹中,始終有恰好四個節點對應於內部元組的質心點周圍的四個象限。在這種情況下,程式碼通常按數字處理節點,不需要明確的節點標籤。若要抑制節點標籤(從而節省一些空間),picksplit 函數可以針對 nodeLabels 陣列傳回 NULL,而 choose 函數可以在 spgSplitTuple 動作期間針對 prefixNodeLabels 陣列傳回 NULL。這反過來會導致在後續呼叫 chooseinner_consistent 期間 nodeLabels 為 NULL。原則上,節點標籤可以用於某些內部元組,而省略於同一個索引中的其他內部元組。

在處理具有未標籤節點的內部元組時,choose 傳回 spgAddNode 是錯誤的,因為在這種情況下假設節點組是固定的。

69.4.3. 完全相同 內部元組 #

picksplit 無法將提供的葉值分為至少兩個節點類別時,SP-GiST 核心可以覆寫運算子類別的 picksplit 函數的結果。發生這種情況時,新的內部元組會建立多個節點,每個節點都有 picksplit 給予其使用的單一節點的相同標籤(如果有),並且葉值會在這些等效節點之間隨機分配。在內部元組上設定 allTheSame 旗標,以警告 chooseinner_consistent 函數,該元組沒有它們可能預期的節點組。

在處理 allTheSame 元組時,choosespgMatchNode 結果會解釋為新的值可以指定給任何等效節點;核心程式碼會忽略提供的 nodeN 值,並隨機下降到其中一個節點(以保持樹狀平衡)。choose 傳回 spgAddNode 是錯誤的,因為這會使節點不全部等效;如果要插入的值與現有節點不匹配,則必須使用 spgSplitTuple 動作。

在處理 allTheSame 元組時,inner_consistent 函數應該傳回所有或沒有任何節點作為繼續索引搜尋的目標,因為它們全部等效。這可能需要或不需要任何特殊情況程式碼,具體取決於 inner_consistent 函數通常對節點的意義假設了多少。

提交更正

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