Есть ли способ предварительно рассчитать SQL View для ускорения запросов из него? - PullRequest
0 голосов
/ 07 мая 2019

Я выполняю множество различных SELECT из SQLite VIEW (динамическая таблица), используя цикл на Python.Базовый запрос SQL для VIEW занимает около 5 секунд.Согласно моему нынешнему пониманию, ПРОСМОТР пересчитывается каждый раз, когда я выполняю ВЫБОР из него.Поскольку в цикле Python я не обновляю никаких таблиц, мне интересно, есть ли способ «заморозить» (предварительно рассчитать) VIEW как статическую таблицу, выполнить быстрые SELECT из нее и после «освобождения» ее.

До этого я пытался оптимизировать базовый код запроса VIEW и сумел сократить время выполнения с 16 до 5 секунд.Я пытался также найти в Интернете команды, похожие на «BEGIN;»и "COMMIT;"которые отлично справляются с задачей обновления таблиц, но не могут их найти.

Мой запрос, который я выполняю из цикла 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.

1 Ответ

2 голосов
/ 07 мая 2019

Если вы выполняете несколько запросов с использованием медленного представления, строки которого не будут меняться между различными запросами, вы можете материализовать его, кэшируя строки представления во временной таблице, и использовать эту таблицу в запросах:

CREATE TEMP TABLE mat_view AS SELECT * FROM actual_view;
-- Create indexes if needed

Временные таблицы удаляются, когда вы закрываете соединение с базой данных, или вы можете явно DROP сделать это, когда закончите с запросами, которые его используют.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...