0

かなり複雑で、複数のサブクエリとユニオンを含む SQL クエリがあります。複雑ではありますが、サブクエリ部分は非常に高速に実行されます (コンパイル後は 1 ミリ秒未満)。しかし、クエリ全体を実行すると、60 ミリ秒以上かかります。

「set statistics time on」と「set statistics io on」を使用してベース テーブルへのアクセスを追跡しましたが、SQL は必要以上に多くの論理読み取りを実行しています。サブクエリを単独で実行すると、読み取りは 10 回程度しか行われませんが、クエリ全体を実行すると約 1800 回になります。

SQL が最初にサブクエリを評価することをお勧めします。予想される行数は 1 ~ 5 であるため、データ セットは非常に小さくなります。次に、同じベース テーブルに内部結合し、推定 10 ~ 20 レコードをプルバックする必要があります。

ヒントを使用して、予想されるケースに対して SQL が確実に最適化されるようにする方法はありますか? クエリ ロジックはオプティマイザーには多すぎるようで、私の状況で存在するよりもはるかに大きな行セットに対してのみ理想的な実行プランを選択しています。

編集:最終結合の条件の 1 つは、ベース テーブルの行の 99.99% を除外します。SQL にそれを最初に評価させることができれば、うまくいくはずです。これを行う方法はありますか?

クエリ テキストはこちら: http://pastebin.com/zVR91AP2

最後の WHERE 句をコメントアウトすると、クエリは 4 行を返し、監査テーブルの 33 回の論理読み取りで 1 ミリ秒未満で実行されます。しかし、WHERE 句のコメントを外すと、3 行 (1 行は除外) が返され、監査テーブルの 1277 回の論理読み取りに 50 ミリ秒かかります。io 統計は、作業テーブルが最初のインスタンスで使用されているが、2 番目のインスタンスでは使用されていないことを示しています。SQL でこの作業テーブルを使用することをお勧めします。

4

1 に答える 1

1

それを解決しました。解決策は、より大きなテーブルに結合する前に内部クエリの評価を強制する結合ヒントを使用することでした。

内部 REMOTE 結合 dbo.poAudit... など

于 2012-05-17T23:56:05.057 に答える