1

アイテムの多くの情報を要約したビューがあります。v_item_details としましょう。

このビューは再帰的な cte によって定義され、適切なフィルタリングが適用されないと非常に遅くなる可能性があります。基本的に、アイテム ID のリストを提供すると、スムーズに実行されます。したがってSELECT * FROM v_item_details WHERE item_id IN(1,2,3)、1秒未満で実行されるようなものです。

別のテーブルで定義されているアイテムのグループのアイテムの詳細を取得しようとすると、事態が複雑になります。SELECT * FROM v_item_details WHERE item_id IN (SELECT item_id FROM items WHERE group_id = 1)group_id がインデックス化されていて、サブクエリが前のクエリと同じ item_id (1、2、および 3) を返す場合でも、クエリには 1 分以上かかります。

テーブル変数を作成し、そこにサブクエリの結果を挿入して結合しようとしましたが、それでも 1 分以上かかりました。

次に、item_id をパラメーターとして受け取るテーブル値関数でビューをラップし、クロス適用を実行して、単純な選択と同じプランを強制的に実行しようとしましたが、4 分以上かかりました!

現在、ID を選択して高速サブクエリを実行する動的クエリを使用しています。しかし、それは最適ではありません。なぜなら、私はストアド プロシージャに行き詰まっており、さらに操作できるビューではないからです。

SQL に最初にサブクエリの値を選択させ、次に高速サブクエリを実行させる方法について何か考えはありますか? LOOP 結合クエリ ヒントを使用するとうまくいくと思いましたが、サブクエリから始まるループは実行されましたが、ビューのクエリ プランは高速クエリと同じではなかったため、うまくいきませんでした。パフォーマンスの問題。

よろしく、 カルロス・ジョルダン

4

1 に答える 1

0

問題を再現して診断するために、独自の SQL Server インスタンスで構築できる実際の例があると役立ちます。それがない場合、私が試すかもしれないいくつかのことがあります:

  • テーブルの統計がitems最新であることを確認する
  • IN 句ではなく JOIN を使用してみてください (これらは一般的に同じはずですが、COLUMNSTORE インデックスなどの特定のケースでは動作が大きく異なるため、再帰 CTE にも癖がある可能性があります)。
  • vw_item_detailsで使用されるテーブルに適切な主キーおよび/またはインデックスがあることを確認してください
  • * from ではなく、必要な列のみを選択してみてくださいvw_item_details(ロングショットですが、わかりません...)
于 2012-08-09T08:25:33.553 に答える