アイテムの多くの情報を要約したビューがあります。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 結合クエリ ヒントを使用するとうまくいくと思いましたが、サブクエリから始まるループは実行されましたが、ビューのクエリ プランは高速クエリと同じではなかったため、うまくいきませんでした。パフォーマンスの問題。
よろしく、 カルロス・ジョルダン