1

-conditionから-clauseselectに移動すると、速度が速くなるという状況があります。dateadd()onwhere

onただし、 -conditionから -clause に移動できない場合もありますwhere。私の解決策は、代わりに -condition から一時テーブルに移動することでした。これにより、ストアド プロシージャ全体が高速化されましたdateadd()on

しかし、私は疑問に思っています。dateadd()-条件で他の場所よりも遅いというのは本当に本当onでしょうか?

4

1 に答える 1

3

正確なSybaseの参照が見つからない限り、SQL Serverのいくつかの参照で答えますが、すべてのクエリオプティマイザーは同様に機能します

まず、述語の DATEADD 関数はインデックスの使用を無効にします (ここの番号 2を参照)。

もちろん、ON 句は述語の形式なので (古い暗黙の JOIN-in-WHERE 構文を考えてください)、同じことが当てはまります。

現在、クエリは論理的な処理ステップを尊重します(実際ではない場合、「クエリ オプティマイザー」と呼ばれるのはそのためです)。WHERE の前の ON はその 1 つです。

WHERE 句で DATEADD を使用すると、行を制限するために主な作業が ON 句で行われたため、これは残差フィルターになります。DATEADD が ON 句にある場合、WHERE 句よりも「早く」処理されます。

これは、Sybase JOIN ドキュメントの状態によるものです。

...オプティマイザーは、列名のインデックスのみを考慮することができます。任意のタイプの演算子または式を列名と組み合わせて使用​​すると、オプティマイザーは可能なアクセス方法として列のインデックスを使用して評価しないことを意味します。結合内の列が互換性のないデータ型である場合、オプティマイザは列の 1 つのみのインデックスを考慮することができます。

クエリの処理順序については、このSybase docでヒントが示されています。

同じことが LEFT JOINS の外部テーブル フィルターにも当てはまります。この場合、LEFT JOIN の後で WHERE 句が遅すぎます。または、なぜ NOT EXISTS はほとんど常に LEFT JOIN .. IS NULL よりも優れています。Sybase OUTER JOINSについては、こちらを参照してください

DATEADD 自体は問題ではありません。問題のように見えるのは、論理的なクエリ処理順序です。

于 2013-04-25T13:08:18.593 に答える