2011年7月14日

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

武田と申します。

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@xxxxx
[mailto:pgsql-jp-bounces@xxxxx] On Behalf Of nozawakz@xxxxx
jp
Sent: Thursday, July 14, 2011 10:15 PM
To: pgsql-jp@xxxxx
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)

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


投稿者 xml-rpc : 2011年7月14日 23:00
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/105253
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。