pg_am カタログにはインデックスアクセスメソッドの情報が格納されています。システムがサポートするそれぞれのインデックスアクセスメソッドに対し一つの行が存在します。
表 43-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 である行をインデックスが無視する場合には間違いとなります。しかし、インデックス付けされた最初の列が NULL である行を無視するのは問題ありません。(GiST は現在、そのように動作します。)amindexnulls はインデックスメソッドが NULL の任意の組み合わせを含め、すべての行をインデックス付けするときにのみ真に設定する必要があります。