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