【发布时间】:2019-09-19 02:36:05
【问题描述】:
我试图找到在单个查询中多次迭代同一组数据的最佳方法,并且我开始想知道“with”是否会节省一些执行时间(通过减少次数我必须查询我需要使用的数据),因为有些人声称它只创建对源的引用(子查询),而另一些人声称它将查询结果存储在内存中,然后允许您查询它们(这就是我想要的)节省大量的执行时间。
为了更好地解释这里是我的代码简历:
WITH MY_DATA AS(
SELECT
TABLE_A, TABLE_A.B, TABLE_B.C
FROM TABLE_A
JOIN
TABLE_B
ON TABLE_A.SOME_FILTER = TABLE_B.SOME_FILTER
WHERE SOME_OTHER_CONDITION = 0
)
SELECT
SUM CASE WHEN(A = 'SOME_VALUE') THEN '1' ELSE 0 END
FROM MY_DATA
UNION ALL
SELECT
SUM CASE WHEN(B = 'SOME_OTHER_VALUE') THEN '1' ELSE 0 END
FROM MY_DATA
UNION ALL
SELECT
SUM CASE WHEN(C = 'YET_ANOTHER_VALUE') THEN '1' ELSE 0 END
FROM MY_DATA
在每个联合中使用子查询会有什么不同吗?还是我只是让它美观?
【问题讨论】:
-
嗯,如果您进行大量迭代,这听起来像是#temp 表的案例。
-
看看你的解释计划。
-
重写查询,其中'MY_DATA'在所有3种情况下都是子查询,然后比较执行计划
-
my_data查询将被执行 3 次,这里没有魔法。with子句不仅仅是语法糖,因为它允许recursive queries。 -
为什么不重写为3列的单行查询?
标签: sql sql-server