質問: 場合により問い合わせが異常に遅い(postgresql) こんにちは、honiyonです。 2つのテーブルを参照して結果を問い合わせるsqlについて質問です。 select * from a,b where ((a.id=b.id) and (a.dat1=1)) and (a.kind=1) and (a.open=1) order by a.hoge; で問い合わせると返ってくるまで数秒時間がかかります。 しかし、 select * from a,b where ((a.id=b.id) and (a.dat1=1)) and (a.kind=0) and (a.open=0) order by a.hoge; で問い合わせると瞬時に返ってきます。 双方とも検索結果は0件です。 検索処理の条件は同じはずなのに・・・と思うのですが。 どんな理由が考えられるでしょうか?また、高速化するにはどんな対策があるでしょうか? 因みに、a.id,b.idはcharで、dat1,kind,openはintです。 distは、vine2.5, dbは、postgresql 7.2.3です。 宜しくお願いします(..
回答: postgresqlについて無知なので一般論として。 indexは指定されてないものとして sqlの条件文が複数指定された場合前から評価するものと後ろから評価するものの 2パターンがあります。 で、使ってるdbにあわせて一番最初に評価される条件式で対象データを一気に絞ります。 仮に前から条件が評価されるとしたら、前2つの条件式は同じなので("a.id=b.id" "a.dat1=1") 3番目の "a.kind="の対象件数が大きく違うのではないでしょうか? a.kind=1の条件に合うのが1000件でa.kind=0が1件なら次の"a.open=?"の評価対象が1000倍違いますので その差がトータルの問い合わせ時間の差になります。 検索方法とindexを張る項目がポイントです。