重要なお知らせ

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

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

postgresql 7.2.1を利用しています。

下記のようなSQL文でクエリーすると、結果が帰るまでに約40秒ほどかかります。
条件1を外すと1秒です。なにか条件絞り込みを入れ子の構造にして、最後に条件1で絞り込むようにすれば、高速化が図れると思うのですが、どのようにすればいいのでしょうか?

select tbl_1.ptnum, tbl_2.name, tbl_5.seidoname
from tbl_1, tbl_2, tbl_3, tbl_4, tbl_5
where tbl_3.ymd>=20000101 and tbl_3.ymd<=20061231 --期間
and tbl_4.endymd>=20050704 --有効期間内
and tbl_2.nusi like '%匿名%' --条件1
and tbl_1.id=tbl_3.id and tbl_1.id=tbl_2.id and tbl_1.id=tbl_4.id and tbl_4.bannum=tbl_5.bannum --結合
order by tbl_1.ptnum


なおfrom行でinner joinで結合したら少し早くなりました。

A 回答 (3件)

explain を使って検索にかかるコストを調べてみてください。



like はindexが効かないので、全件検索になります。ひょっとしたら以下のようなSQLが効き目があるかも。

select t.ptnum, t.name, t.seidoname
from
(select tbl_1.ptnum, tbl_2.name, tbl_5.seidoname
from tbl_1, tbl_2, tbl_3, tbl_4, tbl_5
where tbl_3.ymd>=20000101 and tbl_3.ymd<=20061231 --期間
and tbl_4.endymd>=20050704 --有効期間内
and tbl_1.id=tbl_3.id and tbl_1.id=tbl_2.id and tbl_1.id=tbl_4.id and tbl_4.bannum=tbl_5.bannum --結合) as t
where
t.nusi like '%匿名%' --条件1
order by t.ptnum
    • good
    • 0

これからPostgreSQLをはじめようとしているものです。


Oracleの経験はあるのですが、
Oracleはルールベースで検索しているとき、インデックスなどの優先的に使用される条件以外はWhere分のより後に書いてある条件から検索されるようになっていました。
LIKE文をより前に変えると結果が変わりますか?
また日付の条件はインデックスが設定されているカラムですか?
統計情報を取得している場合はコストベースで考えるのでまた結果は代わってくると思います。
OracleとPostgreSQLの共通点、相違点について興味があります。
よろしければ結果をお教えください。
    • good
    • 0

もし適切な索引が設定されていないのであれば、たくさんの絞込み効果が出るような索引を作成することによって高速化できる場合があります。



ちなみに、各テーブルのデータ件数はどのくらいでしょうか?
    • good
    • 0

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

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