我对 WITH 语句 (CTE) 的理解是它每次查询执行一次。使用这样的查询:
WITH Query1 AS ( ... )
SELECT *
FROM
SomeTable t1
LEFT JOIN Query1 t2 ON ...
如果这导致 100 行,我希望Query1
它只执行一次 - 而不是 100 次。如果该假设是正确的,则运行整个查询所花费的时间大致等于执行以下操作所花费的时间: run Query1
+ select from SomeTable
+ join SomeTable
to Query1
。
我处于以下情况:
Query1
单独运行大约需要 5 秒(40 万行)。- 查询的其余部分,在删除
WITH
语句后LEFT JOIN
需要大约 15 秒(400k 行)。
WITH
因此,当使用语句和原地运行整个查询时LEFT JOIN
,我希望查询能够及时完成,而不是让它运行了一个多小时,一旦停止,它只得到了 11k 行.
我显然错了,但为什么呢?