# 62.3.索引扫描

在索引扫描中,索引访问方法负责返回它已被告知的所有元组的TID,这些元组与扫描键.访问方法是涉及从索引的父表中实际获取这些元组,也不涉及确定它们是否通过扫描的可见性测试或其他条件。

扫描键是一个图形的内部表示哪里表格的条款*索引键* 操作人员 常数,其中索引键是索引的列之一,运算符是与该索引列关联的运算符族的成员之一。索引扫描有零个或多个扫描键,这些键是隐式AND的——返回的元组应该满足所有指定的条件。

access方法可以报告索引是有损,或需要对特定查询进行重新检查。这意味着索引扫描将返回通过扫描键的所有条目,以及可能不通过的其他条目。然后,核心系统的索引扫描机制会将索引条件再次应用于堆元组,以验证是否真的应该选择它。如果未指定“重新检查”选项,索引扫描必须准确返回匹配项集。

请注意,完全由access方法来确保它正确地找到所有且仅找到传递所有给定扫描键的条目。此外,核心系统将简单地移交所有哪里匹配索引键和运算符族的子句,无需任何语义分析来确定它们是冗余的还是矛盾的。举个例子其中x>4和x>14哪里十、是一个b树索引列,它留给b树阿姆雷斯坎功能实现第一个扫描键是冗余的,可以丢弃。过程中所需的预处理程度阿姆雷斯坎将取决于索引访问方法需要将扫描键减少到“标准化”形式的程度。

一些访问方法以定义良好的顺序返回索引项,而另一些则不返回。实际上,access方法可以通过两种不同的方式支持排序输出:

  • 应该设置总是以数据的自然顺序返回条目的访问方法(如btree)阿姆卡诺德这是真的。目前,此类访问方法必须使用与btree兼容的策略编号来实现其相等和排序运算符。

  • 应设置支持排序运算符的访问方法阿姆卡诺德比约普这是真的。这表明索引能够按满足的顺序返回条目订购人 索引键 操作人员 常数.该表单的扫描修改器可以传递给阿姆雷斯坎如前所述。

    这个amgettuple函数具有方向参数,可以是正向(正常情况)或后向.如果之后第一次打电话阿姆雷斯坎指定后向,则匹配的索引项集将被前后扫描,而不是按正常的前后方向,因此amgettuple必须返回索引中最后一个匹配的元组,而不是通常返回的第一个元组。(这仅适用于设置阿姆卡诺德是的。)第一次打电话之后,amgettuple必须准备好从最近返回的条目向任意方向推进扫描。(但如果amcanbackward如果为false,则所有后续调用的方向都将与第一个调用的方向相同。)

    支持有序扫描的访问方法必须支持在扫描中“标记”位置,然后返回到标记位置。同一位置可能会多次恢复。然而,每次扫描只需要记住一个位置;一个新的安马尔克斯堡呼叫覆盖先前标记的位置。不支持有序扫描的访问方法不需要提供安马尔克斯堡阿姆斯特罗斯酒店功能于索引路线; 将这些指针改为NULL。

    在索引中同时插入或删除时,扫描位置和标记位置(如果有)必须保持一致。如果新插入的条目没有通过扫描返回(如果扫描开始时该条目已经存在的话,该扫描本可以找到该条目),或者扫描在重新扫描或备份时返回这样一个条目,即使该条目第一次没有返回,也可以。同样,同步删除可能会也可能不会反映在扫描结果中。重要的是,插入或删除不会导致扫描遗漏或增加未插入或删除的返回条目。

    如果索引存储原始索引数据值(而不是它们的有损表示),则支持仅索引扫描,其中索引返回实际数据,而不仅仅是堆元组的TID。只有在可见性地图显示TID位于全可见页面上时,才能避免I/O;否则必须访问堆元组以检查MVCC可见性。但这与访问方法无关。

    而不是使用amgettuple,索引扫描可以用amgetbitmap在一次调用中获取所有元组。这显然比amgettuple因为它可以避免访问方法中的锁定/解锁循环。原则上amgetbitmap应具有与重复相同的效果amgettuple电话,但我们施加了一些限制来简化问题。首先amgetbitmap一次返回所有元组,不支持标记或恢复扫描位置。其次,元组以位图的形式返回,位图没有任何特定的顺序,这就是为什么amgetbitmap一点也不需要方向论点(此类扫描也不会提供订购操作员。)此外,也没有提供仅索引扫描的功能amgetbitmap,因为无法返回索引元组的内容。最后amgetbitmap不保证对返回的元组进行任何锁定,其含义在第62.4节.

    请注意,访问方法只允许实现amgetbitmap而不是amgettuple,反之亦然,如果其内部实现不适合一个API或另一个API。