[pgsql-jp: 42065] hash インデックスがb-treeインデックスより大きくなる
NISHIMURA Yutaka
iscream @ nugae.org
2020年 10月 10日 (土) 16:57:03 UTC
西村です。
hash インデックスがb-treeインデックスよりかなり大きくなり
同じテーブルのhashインデックス同士でサイズが違うのいう状態になっており
理解が追いつかないので質問させて頂きます。
1000万件程度のデータが入ったテーブルに置いて、下記のようになります
(インデックス名等、一部加工してます)
psql (12.4)
Type "help" for help.
hoge=# \di+
public | estatus_id_excl | index | | estatus | 384 MB |
public | setatus_label_hidx | index | | estatus | 514 MB |
public | estatus_label_idx | index | | estatus | 274 MB |
public | estatus_type_hidx | index | | estatus | 514 MB |
public | estatus_type_idx | index | | estatus | 217 MB |
estatus_id_excl、setatus_label_hidx、estatus_type_hidxはhashインデックス
estatus_label_idx、estatus_type_idxは btreeインデックスです
どちらもTEXT型で4〜10バイト程度のデータが格納されています
estatus_id_exclもUUID型のhashインデックスですが、
ALTER TABLE public.estatus
ADD CONSTRAINT estatus_id_excl EXCLUDE USING hash (id WITH =);
として付けたものです
1.hashインデックスは4バイトのハッシュ値を取るため、データ型の種類等に
関係なく同一のサイズのインデックスになる
2.hashインデックスは4バイトのハッシュ値を取るため、
データをそのまま格納しているtext型のbtreeインデックスより、
ほとんどの場合、小さなインデックスになる
と言う認識でしたが、実際の所 UUIDを格納したカラムのインデックス estatus_id_excl と
TEXT型を格納したカラムのインデックス、setatus_label_hidx、estatus_type_hidx のサイズが異なる
btreeインデックスの estatus_type_idx より、hashインデックスのestatus_type_hidxの方が
2倍以上に大きい
PostgreSQL11の時も同じような結果になっていましたが
これはどういった結果このようになるのでしょうか?
以上宜しくお願いいたします。
--
NISHIMURA,Yutaka./西村ゆたか <iscream @ nugae.org>
pgsql-jp メーリングリストの案内