43.3. pg_am

pg_am 存储有关索引访问方法的信息。 系统支持的每种索引访问方法都有一行。

Table 43-3. pg_am 字段

名字类型引用描述
amnamename 访问方法的名字
amownerint4pg_shadow.usesysid所有者的用户ID(目前没有使用)
amstrategiesint2 这个访问方法的操作符策略个数
amsupportint2 这个访问方法的支持过程个数
amorderstrategyint2 如果索引不提供排序顺序,为零,否则就是描述排序顺序的策略操作符个数
amcanuniquebool 这种访问方式是否支持唯一索引?
amcanmulticolbool 这种访问方式是否支持多字段索引?
amindexnullsbool 这种访问方式是否支持NULL索引记录?
amconcurrentbool 这种访问方式是否支持并发更新?
amgettupleregprocpg_proc.oid"下一个有效元组" 函数
aminsertregprocpg_proc.oid"插入这个元组"函数
ambeginscanregprocpg_proc.oid"开始新扫描"函数
amrescanregprocpg_proc.oid"重新开始这个扫描"函数
amendscanregprocpg_proc.oid"结束这次扫描"函数
ammarkposregprocpg_proc.oid"标记当前扫描位置"函数
amrestrposregprocpg_proc.oid"恢复已标记的扫描位置"函数
ambuildregprocpg_proc.oid"建立新索引"函数
ambulkdeleteregprocpg_proc.oid批量删除函数
amvacuumcleanupregprocpg_proc.oidVACUUM后清理函数
amcostestimateregprocpg_proc.oid估计一个索引扫描的开销

一种支持多字段(amcanmulticol 为真) 的访问方法必须支持在第一个字段以后的字段里对空值(NULL) 建索引,因为规划器会假设这个索引可以用于只用第一个字段的查询。 假设有一个在(a,b)上的索引,而一个查询的条件是WHERE a = 4, 系统会认为可以在 a = 4 上使用索引来扫描,如果 索引忽略了b为空(null)的行那么是错误的。但是如果它忽略了第一个 索引字段为空的行则是正确的(目前GiST就是这样。) 只有在索引访问方法索引了所有行,包括那些任意null的组合的行之后, 才可以把 amindexnulls 设置为真。