1

マスター/詳細の単純なスキーマからいくつかのデータを取得するクエリがあります。WHERE句は次のようになります。

-- These are just random numbers
Where ticket.type_id in ( 2, 3, 4, 5, 7 ) and
      (
         ticket.color_id is null or
         ticket.color_id in ( 1, 2 , 8 )
      )

すでに列にインデックスがあります:ticket.type_idとticket.color_id、とにかくQUERY EXPLAIN ANALYZEは、Postgresqlがクエリを満たすためにシーケンシャルスキャンを行っていることを示しています。

このクエリはシステム内で非常に重要で繰り返し発生するため、この場合に備えて特別にインデックスを作成します。

このケースを解決できるインデックスは何ですか?

4

2 に答える 2

3

まず、インデックスが実際に役立つことを確認します。クエリが呼び出される前に、シーケンススキャンをオフにして、インデックスの使用を強制します。

SET ENABLE_SEQSCAN TO OFF;

クエリの実行後:

SET ENABLE_SEQSCAN TO ON;

シーケンススキャンを再度有効にします。これでパフォーマンスの向上が見られない場合、Postgresはすでに正しい実行プラン(シーケンススキャン)を選択しています。explain analyze <query>シーケンススキャンをオンとオフの両方で使用して、クエリ全体に対してを 実行します。

vacuum analyze関連するテーブルでを実行しましたか?プランナーがクエリの正しい統計または現在の統計を持っていない可能性があります。

于 2012-06-05T23:13:46.307 に答える
1

確かではありませんが、nullはyuoになっていると思います。

多分このような奇妙な外観の構造

Where ticket.type_id in ( 2, 3, 4, 5, 7 ) and
      (
         nvl(ticket.color_id,1) in ( 1, 2 , 8 )
      )
于 2012-06-05T21:40:56.583 に答える