SQLite-防止缓慢评估CTE多次

时间:2018-08-03 14:04:03

标签: sqlite

我正在使用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

,则大约需要1秒

0 个答案:

没有答案