Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite-防止多次评估缓慢的CTE_Sqlite - Fatal编程技术网

SQLite-防止多次评估缓慢的CTE

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

我用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文档说明了。我还以同样的方式测试了查询慢速视图,它也有同样的性能问题

有没有办法让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。上面的递归表仅用于独立示例。您必须显式创建一个临时表。