1

HUGEwhere句を使用してクエリを実行するストアドプロシージャがあります。それ自体、WHERE句は非常に単純です。のように見えます

SELECT a, b, c FROM table
WHERE (cond1) OR (cond2) OR (cond3) OR (cond4)

ここで、cond1、cond2、cond3、およびcond4はすべて、ユーザーからの要件を表しています。

私の質問はクエリのパフォーマンスに関するものです。4つの個別のクエリ(それぞれ条件cond {1..4}のいずれかを使用)を実行し、結果を一時テーブルに挿入して、最後にその一時テーブルからすべてを選択するのは理にかなっていますか? ?

私が疑問に思っているのは、dbmsがそのような状況に最適化されているかどうかです。

FWIW、私はSyabseASE-TDS5.5を使用しています。

ありがとうハーシャス

PS:「自分でベンチマークを行う」ように言わないでください。最終的にはそうするつもりです。もしあれば、そのような最適化の内部を指すリンクを私が本当に探しているもの。TY :)

4

3 に答える 3

2

WHEREを大きくすると、ほとんどの場合、複数のクエリに分割して結果を追加するよりも高速になります。

複数のクエリで、クエリごとにテーブルをスキャンしていることを考慮してください。これにより、発生する可能性のあるディスクIOは言うまでもなく、かなりのオーバーヘッドが追加されます。次のクエリのためにデータをメモリに戻すだけでデータをメモリから失うリスクを冒すよりも、メモリにデータがあるときに比較する必要があるすべてを比較するのが最善です。

于 2011-01-17T07:05:27.783 に答える
2

分割クエリが高速になる理由は、インデックスを使用して小さな個別のクエリを解決できるためです。大きなクエリはテーブル スキャンになります。

最初の質問は、テーブルにインデックスがあるかどうかです。そうでない場合は、常にテーブル スキャンが必要であり、クエリを N 個の部分に分割すると、N 個のテーブル スキャンが発生するだけです。

インデックスがある場合は、オプティマイザーがそれらを使用することを決定したかどうかをテストする必要があります。クエリ オプティマイザーが既にそれらを使用している場合は、クエリを分割しても意味がありません。

インデックスがあり、クエリ オプティマイザーがそれらを使用せず、それらを使用した方が高速であることがテストで示されている場合は、クエリを分割することでメリットが得られます。

于 2011-01-17T07:10:31.643 に答える
2

すべてを 1 つの WHERE 句に含めると、少なくとも DBMS はそれを最適化する機会を得ることができます。個別のクエリを使用すると、DBMS は最適化できません。

その上、一時テーブル、複数のクエリ、およびすべてを組み合わせることで、大量のオーバーヘッドを追加しているように思えます。あなたの 2 番目のオプションがどのように高速化され、さらに高速化されるのか想像できません。

于 2011-01-17T07:04:14.040 に答える