SQLite-防止多次评估缓慢的CTE
我用CTE在一个大表上做一个缓慢的查询。CTE生成少量结果,我在UNION子句中多次使用这些结果,如下所示:SQLite-防止多次评估缓慢的CTE,sqlite,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次。SQLit
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文档说明了。我还以同样的方式测试了查询慢速视图,它也有同样的性能问题
有没有办法让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秒,但是如果我将最后一行从slow\u cte中选择x,大约需要1秒左右的时间。slow\u cte是递归的吗?如果是这样,请阅读递归CTE部分中的优化说明。不,只是一个普通的CTE。上面的递归表仅用于独立示例。您必须显式创建一个临时表。