13

私はこのようなクエリを持っています:

select * from (
    select * from TableX
    where col1 % 2 = 0
) subquery
where col1 % 4 = 0

実際のサブクエリはもっと​​複雑です。サブクエリを単独で実行すると、おそらく200行がすぐに返されますが、クエリ全体を実行すると、待機に時間がかかりすぎます。

SQL Serverがここで最適化を行い、whereステートメントをサブクエリにマージして、それほど効率的ではない新しい実行プランを生成することを私は知っています。実行プランを詳しく調べて、インデックスがないなど、統計が古くなっている理由を分析することはできますが。

しかし、BaseTableとして機能するサブクエリはデータのごく一部しか返さないので、それ以降のすべてのフィルタリングまたは結合はこれらのデータのごく一部でのみ行われることを私は確かに知っています。

私の質問は、外部whereステートメントを気にせずに、SQLサーバーに最初にサブクエリを実行させることはできますか?(ところで、TempTableは私の最後のオプションであり、CTEは機能していません)

4

4 に答える 4

-4

そのためにcteを使用できます。

with cte as(
 select * from TableX where col1 % 2 = 0 
)

select * from ( select * from cte ) subquery where col1 % 4 = 0
于 2012-12-10T08:51:09.173 に答える