我使用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上执行查询。
答案 0 :(得分:2)
如果您正在使用慢速视图运行多个查询,而该慢速视图的行在不同查询之间不会改变,则可以通过将视图的行缓存在临时表中来实现它,并在查询中使用该表: / p>
CREATE TEMP TABLE mat_view AS SELECT * FROM actual_view;
-- Create indexes if needed
在关闭数据库连接时,临时表将被删除,或者在使用它的查询完成后,您可以显式DROP
。