如果有一种方法可以预先计算 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 视图以加快查询速度?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server索引视图以(物化视图)及索引视图与查询重写

sql server 2008 - 添加一个计算不同值的行

SQL中的存储过程,函数,视图有啥区别?

SQL 百分位数计算运行非常缓慢 - 需要帮助加快速度

基于 mysql 视图结果创建表以加快获取速度

加快oracle sql删除查询[重复]