我正在使用CTE对大型表进行慢速查询。 CTE会产生少量的结果,而我在UNION子句中使用了几次,如下所示:
WITH slow_cte(x,y,z) AS (SELECT ... FROM large_table WHERE ...)
SELECT x FROM slow_cte UNION SELECT y FROM slow_cte UNION SELECT z FROM slow_cte
缓慢的查询本身需要X秒才能完成。但是此查询需要3秒钟才能完成,表明CTE正在执行3次。 SQLite文档指出CTE works in the same way as a temporary view。我还测试了以相同方式查询慢速视图,并且它具有相同的性能问题。
是否有任何方法可以使SQLite缓存CTE的结果以提高性能?我希望避免创建临时表。
这是一个独立的查询,演示了我的问题:
WITH
RECURSIVE large_table(x, y, z) AS
(VALUES(0,0,0) UNION ALL SELECT x+1, 'Y' || (x+1), 'Z' || (x+1) FROM large_table WHERE x<500000),
slow_cte(x, y, z) AS
(SELECT x, y, z FROM large_table WHERE x%100000 = 1)
SELECT x FROM slow_cte UNION SELECT y from slow_cte UNION SELECT z FROM slow_cte
在我的计算机上,此查询需要大约4秒钟才能运行,但是如果我将最后一行更改为SELECT x FROM slow_cte