[pgsql-jp: 40858] Re: PostgreSQLにおける複合PKと複合INDEXの選択基準

武田 憲太郎 takeda @ youmind.jp
2011年 7月 14日 (木) 23:00:00 JST


武田と申します。

DDL(各カラムのデータ型)が解らないので何とも言えないのですが、

・castを伴うwhere区となっている。
・explain上でもSQLとは異なるcastが行われている。

以上の理由により想定外のindexが使われている気がします。

「pk_t_z」よりも「idx_t_z_02」が優先される理由までは解らないのですが
必要なcast処理を行った関数indexを定義するか
右辺と左辺の型をキッチリとあわせれば想定通りの動作になると思います。

==========================================================================
株式会社ユーマインド 武田憲太郎
ヒトメボ|一目惚れしたとき押すスイッチ http://www.tokiomonsta.tv/hitomebo/
mono|時間と場所でつながるソーシャルアルバム http://tokiomonsta.tv/mono/
==========================================================================


-----Original Message-----
From: pgsql-jp-bounces @ ml.postgresql.jp
[mailto:pgsql-jp-bounces @ ml.postgresql.jp] On Behalf Of nozawakz @ nttdata.co.
jp
Sent: Thursday, July 14, 2011 10:15 PM
To: pgsql-jp @ ml.postgresql.jp
Subject: [pgsql-jp: 40857] PostgreSQLにおける複合PKと複合INDEXの選択基準

お世話になっております。野沢と申します。


PostgreSQLにおける複合PKと複合INDEXの選択基準について
質問させてください。

下記のSQL(※)では、第1PK、第2PK、第3PKで一意に絞り込まれるため、複合PK
(pk_t_z)を使っての実行計画が選択されることを
期待していたのですがExplain文で取得みると複合INDEX(idx_t_z_02)の方が選択さ
れておりました。

PostgreSQLではHOTの「インデックス・エントリの追加をスキップ」する機能がある
ため、
優先的に複合PKよりも複合INDEXが選択されるのでしょうか。
PostgreSQLにおける複合PKと複合INDEXの選択基準があれば合わせてご教授くださ
い。

Explain対象SQL、実行計画、実行時INDEX情報は下記のとおりです。

※[Explain対象SQL]
        SELECT
            a,
            b,
            c,
        FROM t_z
        WHERE a = CAST(:subscriberId AS BIGINT)
            AND c = CAST(:detailsSnum AS INTEGER)
            AND b = :serviceContactId
            AND e = 'n';

[実行計画]
 Index Scan using idx_t_z_02 on t_z  (cost=0.00..8.47 rows=1 width=505)
(actual time=74.420..74.421 rows=1 loops=1)
   Index Cond: ((a = 86129::bigint) AND (b = '10086063       '::bpchar))
   Filter: ((c = 1) AND (e = 'n'::bpchar))
 Total runtime: 74.490 ms
(4 行)

[実行時INDEX情報]
インデックス:
    "pk_t_z" PRIMARY KEY, btree (a, b, c)
    "idx_t_z_01" btree (b)
    "idx_t_z_02" btree (a, b, d)



以上、よろしくお願い致します。



pgsql-jp メーリングリストの案内