pg_am 存储有关索引访问方法的信息。 系统支持的每种索引访问方法都有一行。
Table 41-3. pg_am 字段
名字 | 类型 | 引用 | 描述 |
---|---|---|---|
amname | name | 访问方法的名字 | |
amowner | int4 | pg_shadow.usesysid | 所有者的用户ID(目前没有使用) |
amstrategies | int2 | 这个访问方法的操作符策略个数 | |
amsupport | int2 | 这个访问方法的支持过程个数 | |
amorderstrategy | int2 | 如果索引不提供排序顺序,为零,否则就是描述排序顺序的策略操作符个数 | |
amcanunique | bool | 这种访问方式是否支持唯一索引? | |
amcanmulticol | bool | 这种访问方式是否支持多字段索引? | |
amindexnulls | bool | 这种访问方式是否支持NULL索引记录? | |
amconcurrent | bool | 这种访问方式是否支持并发更新? | |
amgettuple | regproc | pg_proc.oid | "下一个有效元组" 函数 |
aminsert | regproc | pg_proc.oid | "插入这个元组"函数 |
ambeginscan | regproc | pg_proc.oid | "开始新扫描"函数 |
amrescan | regproc | pg_proc.oid | "重新开始这个扫描"函数 |
amendscan | regproc | pg_proc.oid | "结束这次扫描"函数 |
ammarkpos | regproc | pg_proc.oid | "标记当前扫描位置"函数 |
amrestrpos | regproc | pg_proc.oid | "恢复已标记的扫描位置"函数 |
ambuild | regproc | pg_proc.oid | "建立新索引"函数 |
ambulkdelete | regproc | pg_proc.oid | 批量删除函数 |
amvacuumcleanup | regproc | pg_proc.oid | VACUUM后清理函数 |
amcostestimate | regproc | pg_proc.oid | 估计一个索引扫描的开销 |
一种支持多字段(amcanmulticol 为真) 的访问方法必须支持在第一个字段以后的字段里对空值(NULL) 建索引,因为规划器会假设这个索引可以用于只用第一个字段的查询。 假设有一个在(a,b)上的索引,而一个查询的条件是WHERE a = 4, 系统会认为可以在 a = 4 上使用索引来扫描,如果 索引忽略了b为空(null)的行那么是错误的。但是如果它忽略了第一个 索引字段为空的行则是正确的(目前GiST就是这样。) 只有在索引访问方法索引了所有行,包括那些任意null的组合的行之后, 才可以把 amindexnulls 设置为真。