sqlite - 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
解决方案
推荐阅读
- vue.js - Vuetify 在构建为 web 组件时不呈现 v-menu
- git - 当我 `git pull --rebase` 并发生冲突时,我如何`git show` 其他人的提交?
- azure - 如何在 Azure 函数应用中更改 LinuxFxVersion
- javascript - Webpack 5 IgnorePlugin - 仅从 CSS 文件的输出中不忽略 JS 文件?
- c# - 引导多个生产者和消费者
- leaflet - 如何使用传单绘制多边形显示传单路径/传单测量路径的测量值?
- scipy - 将数据写入 .mat 文件
- c - 将宏与令牌粘贴运算符一起使用
- c# - 如何使用异步 lamda 作为参数创建新的通用任务
- javascript - 如何在数组中找到产品