重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

テーブルは2つ
・offacc_siwakedata
・off_projectmster
とあり、それぞれ下記インデックスを張っております。

create index siwakedata_index
ON offacc_siwakedata(
siwakedata_date,
siwakedata_hdcd,
siwakedata_cd,
siwakedata_kamokucode,
siwakedata_projectcode,
siwakedata_exzankada,
siwakedata_default,
siwakedata_compcd,
siwakedata_del
);

CREATE INDEX projectmster_index
ON off_projectmster(
projectmster_cd,
projectmster_del,
projectmster_compcd
);

2つのテーブルを結合させる下記SQLを発行
explain
select
offacc_siwakedata.*,
off_projectmster.projectmster_name
from offacc_siwakedata,off_projectmster
where
off_projectmster.projectmster_cd=siwakedata_projectcode
and
off_projectmster.projectmster_del='1'
and
off_projectmster.projectmster_compcd='200'
and
siwakedata_compcd='200'
and
siwakedata_del='1'
and
siwakedata_default='1'
and
siwakedata_kamokucode='26300'
and
siwakedata_exzankada<>0
order by
siwakedata_date,
siwakedata_hdcd,
siwakedata_cd
;

explainするとoff_projectmsterのインデックスが有効になっていません。
何ででしょうか?
教えてください。
宜しくお願いします。

"Nested Loop (cost=0.00..17438.04 rows=1 width=1307)"
" Join Filter: ((off_projectmster.projectmster_cd)::text = (offacc_siwakedata.siwakedata_projectcode)::text)"
" -> Index Scan using siwakedata_index on offacc_siwakedata (cost=0.00..17436.98 rows=1 width=1244)"
" Index Cond: (((siwakedata_kamokucode)::text = '26300'::text) AND ((siwakedata_default)::text = '1'::text) AND ((siwakedata_compcd)::text = '200'::text) AND (siwakedata_del = 1))"
" Filter: (siwakedata_exzankada <> 0::numeric)"
" -> Seq Scan on off_projectmster (cost=0.00..1.04 rows=1 width=96)"
" Filter: ((projectmster_del = 1) AND ((projectmster_compcd)::text = '200'::text))"

A 回答 (1件)

データは、何件くらい格納していますか?


ANALYZEは、未実行ですか?
表定義、INSERT文の例を、貼り付けてもらえると、アドバイスする方も助かるのですけどね?
PostgreSQLのバージョンは、何ですか?

PostgreSQLは、データ件数が少ないと、コスト情報を未取得でも、ディフォルト値でインデクスを使用しない場合があるようです。

RDBMSの常識として、インデクスの先頭構成列から順に、インデクスを有効利用できる条件式を指定するほど、インデクスを活用できます。

index siwakedata_indexの先頭~3番目は、order by指定しかなく、4番目以降が条件指定なので、これでは有効利用できません。4番目以降を先頭に持って来た方が、いいのではないでしょうか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す