Кеширование результата выдачи хранимой процедуры в SQL Server
Если имеется хранимая процедура, выполняющая тяжелые вычисления, ее результаты можно кешировать
Сброс кеша можно делать либо по расписанию через промежутки времени, либо при действиях, которые обновляют закешированные данные
Допустим, есть процедура
create procedure doHeavyStuff @arg1 int, @arg2 bit, @arg3 nvarchar(64)
С выдачей вида
@result table ( id int, data1 int, data2 int )
Которую нужно кешировать
Тогда кеш можно хранить в таблице вида:
CREATE TABLE [dbo].[cache_doHeavyStuff](
[cacheEntryId] [bigint] IDENTITY(1,1) NOT NULL,
[cacheKey] [nvarchar](256) NULL,
[id] [int] NULL,
[data1] [int] NULL,
[data2] [int] NULL
CONSTRAINT [PK_ProdAndCateg_SttWt] PRIMARY KEY CLUSTERED
(
[cacheEntryId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Где
cacheEntryId - id записи в кеше
cacheKey - ключ кеша. Ключ будет зависеть от входных параметров процедуры, чтобы одинаковые вызовы получали одинаковый кеш.
В нашем случае ключ можно сформировать как
declare @cacheKey nvarchar(256) = concat(@arg1, '_', @arg2, '_', @arg3)
Остальные поля повторяют поля в выдаче процедуры.
По возможности таблицу с кешем можно делать в отдельной базе, чтобы основная не разрасталась из-за временных данных.
Чтобы подключить кеш, процедуру меняем следующим образом:
- Добавляем параметр
@useCache bit = 0
Чтобы управлять кешем
- В начале процедуры собираем из аргументов ключ кеша
- Если кеш включен, проверяем, существует ли в таблице с кешем такой ключ.
Если существует - делаем select выдачи из кеша и завершаем процедуру.
Если нет - продолжаем запуск процедуры, как обычно. Результат работы процедуры сохраняем в таблицу с кешем, чтобы при следующем запуске данные брались оттуда.
Пример:
--ключ
declare @cacheKey nvarchar(256) = concat(@arg1, '_', @arg2, '_', @arg3)
--берем данные из кеша при наличии
if (@useCache=1 and exists(select * from cache_doHeavyStuff where cacheKey=@cacheKey))
begin
select id, data1, data2
from cache_doHeavyStuff
where cacheKey=@cacheKey
return
end
--дальше всё делаем как обычно и результат сохраняем во временную таблицу
select id, data1, data2
into #heavyStuff_temp
from ...
where ...
--если кеш включен, сохраняем данные в кеш
if (@useCache=1) begin
insert into cache_doHeavyStuff (cacheKey, id, data1, data2)
select @cacheKey, id, data1, data2
from #heavyStuffTemp
end
--выдача данных
select * from #heavyStuff_temp
Пример сброса кеша (можно оформить в виде отдельной процедуры):
delete cache_doHeavyStuff where cacheKey=@cacheKey
Что еще посмотреть по SQL Server
SQL. Как работать с датами в SQL Server
SQL Server. Как переносить на новую строку в строковой переменной в SQL
SQL. Вывод разметки HTML в сыром виде (в виде тегов) в SQL
SQL. Как привести дату в строку в нужный формат в SQL Server
SQL. Как использовать select from Хранимка
SQL. Как прописью написать число в SQL
SQL. Как массово залить данные в таблицу БД через CSV (Excel)
SQL. Как перенести сложный тип данных на другую базу
SQL. Как перевести дату JS в дату SQL
SQL. Как выводить окончание у множественного числа (5 заказОВ, 3 заказА)
Настройка полнотекстового поиска fulltext search в SQL Server
Разработчик SQL, нужны клиенты и заказы?
Выгода от использования Falcon Space
В 2-3 раза экономнее и быстрее, чем заказная разработка
Более гибкая, чем коробочные решения и облачные сервисы
Используйте готовые решения и изменяйте под свои потребности
- Шаг 1. Создать концепт проекта
- Шаг 2. Получить оценку бюджета (КП)
- Шаг 3. Заключить договор
- Шаг 4. Создать совместно техническое задание
- Шаг 5. Поэтапная реализация проекта