首页 > 解决方案 > SQLite - 防止多次评估缓慢的 CTE

问题描述

我正在使用 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 秒才能完成。但是这个查询需要 3X 秒才能完成,这表明 CTE 正在执行 3 次。SQLite 文档指出CTE 的工作方式与临时视图相同。我也用同样的方式测试了查询慢视图,它也有同样的性能问题。

有什么方法可以让 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 秒才能运行,但如果我将最后一行更改为大约 1 秒SELECT x FROM slow_cte

标签: sqlite

解决方案


推荐阅读