PostgreSQL の実行計画の Tid Scan

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 の方がコストが小さいですね。

Google サイト内検索

Amazonアソシエイト