8. clustered index を作って比較 - PostgreSQL のソースコードを読む

1000 万件のデータが入った以下の person テーブル。age は 0 - 99 まで 10 万件ずつ一様に分布。(同一ページに同一 age が固まらないように insert)

test=# \d person
      Table "public.person"
  Column   |  Type   | Modifiers 
-----------+---------+-----------
 social_no | integer | not null
 name      | text    | 
 age       | integer | 
 uri       | text    | 
Indexes:
    "person_pkey" PRIMARY KEY, btree (social_no)
    "person_age" btree (age)


まずは clustered index がない状態で

select * from person where age > 49 limit 100000;

おおよそ 300 msec で帰ってくる。


Cluster コマンドで clustered index にする。

cluster person_age on person;

700 MB サイズのテーブルで、373秒。この間ロックがかかるのは微妙だ。まあ実データのディスク上の位置を変えているのだから気持ちは分かる。


\d で CLUSTER マークがついた。

Indexes:
    "person_pkey" PRIMARY KEY, btree (social_no)
    "person_age" btree (age) CLUSTER

同じ query を投げてみる。

select * from person where age > 49 limit 100000;

おおよそ 200 msec くらい。

所感

  • range search だからもっと劇的に効果があると思ったがそうでもなかった
    • clustered index でなくても、buffer pool にうまくヒットしてそこまで I/O が多くなかったのかもしれない
  • clustered Index は使いどころを間違わなければやはり速い
  • CLUSTER コマンドはロックした状態で結構時間がかかるので慎重に。