You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
<structname>IndexAmRoutine</structname>中的有些标志域的含义并不那么直观。<structfield>amcanunique</structfield>的要求在<xref linkend="index-unique-checks"/>中讨论。<structfield>amcanmulticol</structfield>标志断言该索引访问方法支持多列索引, <structfield>amoptionalkey</structfield>断言它允许对那种在第一个索引列上没有给出可索引限制子句的扫描。如果<structfield>amcanmulticol</structfield>为假,那么<structfield>amoptionalkey</structfield>实际上说的是该访问方法是否允许不带限制子句的全索引扫描。 那些支持多索引列的访问方法<emphasis>必须</emphasis>支持那些在省略了除第一个列之外的任何或所有其它列上约束的扫描;不过,它们被允许去要求在第一个列上出现一些限制,并且这一点是以把<structfield>amoptionalkey</structfield>设置为假作为标志的。一个索引 AM 可能将<structfield>amoptionalkey</structfield>设置为假的一种原因是,如果它不索引空值。因为大多数可索引的操作符都是严格的并且因此不能对空输入返回真,所以不为空值存储索引项咋看上去很吸引人:因为它们不 可能被一个索引扫描返回。不过,当一个索引扫描对于一个给定索引列上没有约束子句时,这种讨论就不成立了。实际上,这意 味着设置了<structfield>amoptionalkey</structfield>为真的索引必须索引空值,因为规划器可能会决定在根本没有扫描键的时候使用这样的索引。一个相关的限制是一个支持 多索引列的索引访问方法<emphasis>必须</emphasis>支持索引第一列之后的列中的空值,因 为规划器会认为这个索引可以用于在那些列上没有限制的查询。例如,考虑一个在(a,b)上的索引和一个有<literal>WHERE a = 4</literal>的查询。系统会认为该索引可以用于扫描 <literal>a = 4</literal>的行, 如果索引忽略了 b 为空的行,那么就是错误的。不过,忽略那些在第一个索引列上值为空的行是 OK 的。一个索引空的索引访问方法可能也会设置<structfield>amsearchnulls</structfield>,表明它支持将<literal>IS NULL</literal>和<literal>IS NOT NULL</literal>子句作为搜索条件。
371
+
<structname>IndexAmRoutine</structname>中的有些标志域的含义并不那么直观。<structfield>amcanunique</structfield>的要求在<xref linkend="index-unique-checks"/>中讨论。<structfield>amcanmulticol</structfield>标志断言该索引访问方法支持多键列索引, <structfield>amoptionalkey</structfield>断言它允许对那种在第一个索引列上没有给出可索引限制子句的扫描。如果<structfield>amcanmulticol</structfield>为假,那么<structfield>amoptionalkey</structfield>实际上说的是该访问方法是否允许不带限制子句的全索引扫描。 那些支持多索引列的访问方法<emphasis>必须</emphasis>支持那些在省略了除第一个列之外的任何或所有其它列上约束的扫描;不过,它们被允许去要求在第一个列上出现一些限制,并且这一点是以把<structfield>amoptionalkey</structfield>设置为假作为标志的。一个索引 AM 可能将<structfield>amoptionalkey</structfield>设置为假的一种原因是,如果它不索引空值。因为大多数可索引的操作符都是严格的并且因此不能对空输入返回真,所以不为空值存储索引项咋看上去很吸引人:因为它们不 可能被一个索引扫描返回。不过,当一个索引扫描对于一个给定索引列上没有约束子句时,这种讨论就不成立了。实际上,这意 味着设置了<structfield>amoptionalkey</structfield>为真的索引必须索引空值,因为规划器可能会决定在根本没有扫描键的时候使用这样的索引。一个相关的限制是一个支持 多索引列的索引访问方法<emphasis>必须</emphasis>支持索引第一列之后的列中的空值,因 为规划器会认为这个索引可以用于在那些列上没有限制的查询。例如,考虑一个在(a,b)上的索引和一个有<literal>WHERE a = 4</literal>的查询。系统会认为该索引可以用于扫描 <literal>a = 4</literal>的行, 如果索引忽略了 b 为空的行,那么就是错误的。不过,忽略那些在第一个索引列上值为空的行是 OK 的。一个索引空的索引访问方法可能也会设置<structfield>amsearchnulls</structfield>,表明它支持将<literal>IS NULL</literal>和<literal>IS NOT NULL</literal>子句作为搜索条件。
<literal>indexUnchanged</literal>布尔值暗示了索引元组的性质。如果为真,则元组是现有索引元组的副本。新元组是逻辑上不变的后继 MVCC 元组版本。当<command>UPDATE</command>执行,没有更改任何被索引的列,但仍请求索引中的新版本时,就会发生这种情况。当同一逻辑行的多个版本累积时,索引 AM 可以使用此提示来决定是否对索引的某些部分应用自下而上的索引删除。请注意更新非键列不会影响<literal>indexUnchanged</literal>的值。
489
+
</para>
480
490
<!--==========================orignal english content==========================
481
491
<para>
482
492
The function's Boolean result value is significant only when
如果索引支持<link linkend="indexes-index-only-scans">只用索引扫描</link>(即<function>amcanreturn</function>对它返回 TRUE),则在成功时 AM 也必须检查<literal>scan->xs_want_itup</literal>,并且如果检查为真它必须返回索引项的原始被索引数据。该数据的返回形式可以是一个存储在<literal>scan->xs_itup</literal>中的<structname>IndexTuple</structname>指针外加元组描述符<literal>scan->xs_itupdesc</literal>,或者是一个存储在<literal>scan->xs_hitup</literal>中的<structname>HeapTuple</structname>指针外加元组描述符<literal>scan->xs_hitupdesc</literal>(在重构可能无法放在一个<structname>IndexTuple</structname>中的数据时,应该使用后一种格式)。不管是哪种形式,访问方法应该负责管理好指针引用的数据。至少在为扫描下一次调用<function>amgettuple</function>、<function>amrescan</function>或<function>amendscan</function>之前,该数据必须是完好的。
975
+
如果索引支持<link linkend="indexes-index-only-scans">只用索引扫描</link>(即<function>amcanreturn</function>对其任何一列返回 TRUE),则在成功时 AM 也必须检查<literal>scan->xs_want_itup</literal>,并且如果检查为真它必须返回索引项的原始被索引数据。<function>amcanreturn</function>返回false的列可以作为nulls返回。该数据的返回形式可以是一个存储在<literal>scan->xs_itup</literal>中的<structname>IndexTuple</structname>指针外加元组描述符<literal>scan->xs_itupdesc</literal>,或者是一个存储在<literal>scan->xs_hitup</literal>中的<structname>HeapTuple</structname>指针外加元组描述符<literal>scan->xs_hitupdesc</literal>(在重构可能无法放在一个<structname>IndexTuple</structname>中的数据时,应该使用后一种格式)。不管是哪种形式,访问方法应该负责管理好指针引用的数据。至少在为扫描下一次调用<function>amgettuple</function>、<function>amrescan</function>或<function>amendscan</function>之前,该数据必须是完好的。
942
976
</para>
943
977
944
978
<!--==========================orignal english content==========================
0 commit comments