# 66.4.实施

66.4.1. SP GiST限制

66.4.2. 不带节点标签的SP GiST

66.4.3. “所有相同”的内部元组

本节介绍了SP GiST运算符类的实现人员需要了解的实现细节和其他技巧。

# 66.4.1.SP GiST限制

单个叶元组和内部元组必须适合单个索引页(默认为8kB)。因此,在索引可变长度数据类型的值时,长值只能由基数树等方法支持,在基数树中,树的每一级都包含一个足够短以适合页面的前缀,而最终的叶级则包含一个足够短以适合页面的后缀。应该设置运算符类朗瓦卢索克只有当它准备好让这一切发生时,它才是真的。否则,SP GiST core将拒绝索引太大而无法放入索引页的值的任何请求。

同样,操作符类的责任是,内部元组不会变得太大,无法放在索引页上;这限制了一个内部元组中可以使用的子节点的数量,以及前缀值的最大大小。

另一个限制是,当内部元组的节点指向一组叶元组时,这些元组必须都位于同一索引页中。(这是一个设计决策,目的是在将这些元组链接在一起的链接中减少搜索并节省空间。)如果叶元组的集合对于页面来说太大,则执行拆分并插入中间内部元组。为了解决这个问题,新的内部元组必须将叶值集划分为多个节点组。如果操作员类皮克斯普利特如果功能无法做到这一点,SP GiST core会采取中所述的特殊措施第66.4.3节.

什么时候朗瓦卢索克的确,SP GiST树的连续级别将吸收越来越多的信息到内部元组的前缀和节点标签中,使所需的叶数据越来越小,从而最终适合页面。为了防止运算符类中的错误导致无限的插入循环,如果在10个周期内叶数据没有变小,SP GiST核心将引发错误选择方法调用。

# 66.4.2.不带节点标签的SP GiST

有些树算法对每个内部元组使用一组固定的节点;例如,在四叉树中,始终有恰好四个节点对应于内部元组质心点周围的四个象限。在这种情况下,代码通常按编号处理节点,不需要显式的节点标签。要抑制节点标签(从而节省一些空间),请皮克斯普利特函数可以为诺德拉贝尔斯数组和选择函数可以为前缀节点标号数组在spgSplitTuple行动这反过来会导致诺德拉贝尔斯在后续调用中为空选择内部一致.原则上,节点标签可以用于某些内部元组,而对于同一索引中的其他元组则可以省略。

使用具有未标记节点的内部元组时,对于选择归来spgAddNode,因为在这种情况下,节点集应该是固定的。

# 66.4.3.“所有相同”的内部元组

SP GiST core可以重写运算符类的皮克斯普利特皮克斯普利特无法将提供的叶值划分为至少两个节点类别。当这种情况发生时,新的内部元组由多个节点创建,每个节点都有相同的标签(如果有的话)皮克斯普利特给它使用的一个节点,叶值在这些等效节点之间随机分配。这个照样在内部元组上设置标志以警告选择内部一致元组中没有其预期的节点集的函数。

在处理照样元组,一个选择结果spgMatchNode被解释为意味着可以将新值分配给任何等效节点;核心代码将忽略提供的诺登值并随机下降到其中一个节点(以保持树的平衡)。这是一个错误选择归来spgAddNode,因为这会使节点不完全相等;这个spgSplitTuple如果要插入的值与现有节点不匹配,则必须使用操作。

在处理照样塔普尔内部一致函数应该返回全部或全部节点作为继续索引搜索的目标,因为它们都是等效的。这可能需要也可能不需要任何特殊情况代码,这取决于内部一致函数通常假定节点的含义。