Кэшируемые SQL-запросы

Для исключения повторной трансляции и повторного выполнения одних и тех же SQL-запросов пользователь может подсказать СУБД о необходимости кэширования запросов и результатов их выполнения.

Для поддержки механизма кэширования запросов СУБД ЛИНТЕР создает в оперативной памяти две структуры данных:

  • кэш запросов: хранит ссылки на исходный текст кэшируемого SQL-запроса и его оттранслированную версию;

  • кэш результатов выполнения запросов: ссылки на исходный текст кэшируемого SQL-запроса и результат его выполнения.

Тексты запросов и результаты их выполнения хранятся в рабочих файлах СУБД.

При поступлении на обработку очередного кэшируемого SQL-запроса ядро СУБД ищет текст этого запроса в кэше запросов. Это означает следующее:

  • если приложение каждый раз посылает ядру СУБД один и тот же текст кэшируемого SQL-запроса, то он будет найден в кэше результатов выполнения запросов;

  • если приложение посылает ядру СУБД один и тот же оттранслированный SQL-запрос, то результаты такого запроса в кэше результатов найдены не будут и данный запрос будет каждый раз выполняться заново.

В случае успешного поиска повторная трансляция запроса отменяется, и, если для этого запроса задан режим кэширования результата, то результат выполнения запроса извлекается из кэша результатов (в противном случае запрос обрабатывается ядром СУБД).

При изменении данных, влияющих на результат выполнения кэшированного запроса (обновление задействованных в запросе таблиц, удаление используемых синонимов, отмена прав доступа пользователя и т.п.), текущий результат выполнения запроса удаляется из кэша результатов. При следующей попытке получить результат выполнения кэшируемого запроса этот запрос заново обрабатывается ядром СУБД и его результат повторно заносится в кэш результатов.

СУБД ЛИНТЕР поддерживает кэширование только DML-запросов (select, insert, update, delete).

Если задан режим кэширования текстов запросов, то по умолчанию все SELECT-запросы кэшируются.

Использование механизма кэширования может существенно увеличить производительность многих информационно-справочных систем и снизить нагрузку на СУБД. Например, в справочной системе аэропорта значительную часть запросов составляют запросы о расписании полетов в определенные города, длительности полета, цене билетов. В этом случае нет необходимости каждый раз транслировать и выполнять соответствующие запросы – можно сразу брать готовые ответы из кэша результатов, тем более, что обновление таких данных происходит не часто.