如果有一种方法可以预先计算 SQL 视图以加快查询速度?
Posted
技术标签:
【中文标题】如果有一种方法可以预先计算 SQL 视图以加快查询速度?【英文标题】:If there is a way to pre-calculate SQL View in order to speed-up queries from it? 【发布时间】:2019-05-07 13:16:12 【问题描述】:我使用 Python 中的循环从 SQLite VIEW(动态表)执行许多不同的 SELECT。 VIEW 的底层 SQL 查询大约需要 5 秒才能完成。根据我目前的理解,当我从中执行 SELECT 时,每次都会重新计算 VIEW。由于在 Python 周期内,我不更新任何表,我想知道是否有办法将 VIEW “冻结”(预先计算)为静态表,从中执行快速 SELECT,然后“释放”它。
在我尝试优化 VIEW 的底层查询代码并设法将执行时间从 16 秒减少到 5 秒之前。我还尝试在 Internet 中找到类似于“BEGIN;”的命令。和“承诺”;这在更新表格方面做得很好,但找不到任何表格。
我从 Python 循环中执行的查询如下所示:
SELECT date, spread FROM futures_spreads_close
WHERE commodity_id=? AND exp_month_id=? AND exp_year=?
ORDER BY date;
问号是循环索引。
如果我将 VIEW 中的所有逻辑重新实现到 Python 代码中,我可以加速大约 100 次。但是,我想将所有逻辑保留在 SQL 中。我相信有一种更有效的方式来对 VIEW 执行查询。
【问题讨论】:
在支持物化视图的数据库中,答案是“是”。 SQLite 不是这些数据库之一。 有flexview;这是一个类似于 mysql 中的物化视图的概念。 @SegejKosov 。 . .futures_spreads_close
是视图吗?
@GordonLinoff 是的
【参考方案1】:
如果您使用慢速视图运行多个查询,其行不会在不同查询之间发生变化,您可以通过将视图的行缓存在临时表中来实现它,并在查询中使用该表:
CREATE TEMP TABLE mat_view AS SELECT * FROM actual_view;
-- Create indexes if needed
当您关闭数据库连接时会删除临时表,或者您可以在使用它的查询完成后显式地DROP
。
【讨论】:
以上是关于如果有一种方法可以预先计算 SQL 视图以加快查询速度?的主要内容,如果未能解决你的问题,请参考以下文章