PostgreSQL には ORACLE の ROWID のように 行を素早く指定するための列 ctid があります。
db=# SELECT ctid, * FROM test.table1; ctid | f1 | f2 ----------+-------+--------------- (0,1) | A143H | test@test.com (0,2) | A393G | test@test.com (0,3) | A380E | test@test.com (0,4) | A147K | test@test.com
ctid は、行バージョンの物理的位置なので 行を更新したり、VACUUM FULL で変わってしまいます。
ただ、この ctid を使用するとかなり早く行を取得できます。 このときの実行計画に出てくる演算子が Tid Scan なのです。
実際に実行計画を取得してみます。
db=# EXPLAIN db-# SELECT * FROM test.table1 WHERE ctid = '(0,2)'; QUERY PLAN ------------------------------------------------------------ Tid Scan on table1 (cost=0.00..4.01 rows=1 width=218) TID Cond: (ctid = '(0,2)'::tid)
Tid Scan と出ました。
PRIMARY KEY で検索した場合の実行計画も取得してみます。
db=# EXPLAIN db-# SELECT * FROM test.table1 WHERE field1 = 1; QUERY PLAN --------------------------------------------------------------------------- Index Scan using table1_pkey on table1 (cost=0.00..8.27 rows=1 width=50) Index Cond: ((field1)::text = '1'::text)
Index Scan よりも上の Tid Scan の方がコストが小さいですね。