Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
TJ001 Member Откуда: от верблюда Сообщений: 428 |
Исходные данные: Есть отчет, который достаточно долго собирает данные, но результирующй набор очень мал < 2000 строк. Актуальность отчета - сутки, т.е. в течение суток он будет показывать всем одни и те же данные. Между пользователями разница лишь в том, что они смотрят данные с разными фильтрами (в зависимости от уровня доступа) - одним доступно все, другим только часть, третьим другая часть. Число пользователей около 100. Задача: снизить нагрузку на сервер, повысить быстродействие. Может быть это костыль, но хочу сделать кэширование, которое работает так: Любой первый пользователь, запустивший отчет в новом дне, заполняет кэш. Т.е. отчет это делает автоматически. В датасете написано: если в таблице 1 есть данные за период от Дата1 по Дата2 + другие фильтры, то взять данные из таблицы 1, если данных нет, то запустить ряд запросов: в датасете что-то типа if not exists(select null from t1 where date1=@date1 and date2=@date2 and p1 = @p1 and p2 = @p2 and ...) begin delete from t1 where date2<@date2 insert into t1 select @date1 date1 ,@date2 date2 ,@p1 p1 ,@p2 p2 ,... from ... end else select ... from t1 Из запроса видно, что как только пользователь запрашивает данные с новыми параметрами, которых нет в кэше, то кэш дополняется, но все просроченные данные данные удаляются независимо от параметров. @date2 всегда = текущая дата - 1, пользователь не может ее менять, как и @date1 Вопрос следующий: Как проще всего обеспечить целостность данных, чтобы если двое одновременно запустили отчет на утро следующего дня, то только один из них захватил кэш и обновил его? Не хочется городить какую-то специальную таблицу блокировок. Наверняка решение простое, но что-то видно я не выспался... Можно, конечно, сделать джоб, который раз в сутки будет заполнять кэш, но этот вариант мне не подходит по нескольким причинам, одна из которых - отчетом пользуются не всегда |
28 ноя 17, 10:54 [20987673] Ответить | Цитировать Сообщить модератору |
buser Member Откуда: Санкт-Петербург Сообщений: 4537 |
TJ001, вариант с джобой неплох... а так sp_getapplock/sp_releaseapplock |
28 ноя 17, 11:29 [20987786] Ответить | Цитировать Сообщить модератору |
Yasha123 Member Откуда: Сообщений: 1955 |
что-то у вас все как-то сложно. у нас ровно те же требования: Актуальность отчета - сутки, т.е. в течение суток он будет показывать всем одни и те же данные. отчет собирается 1 раз в процедуре, процедура кладет результат в таблицу. эта процедура, как и туча других, есть часть ночного джоба. джоб заполняет необходимые таблицы в схеме staging. каждая таблица имеет колонку datarif, это та дата, на которую собран отчет. последняя инструкция в джобе это переключение всех стэйджинговых таблиц в dbo, в сингл юзере |
28 ноя 17, 11:39 [20987826] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8350 |
TJ001, так заполняйте свой "куб" в нерабочее время по расписанию. |
28 ноя 17, 11:40 [20987828] Ответить | Цитировать Сообщить модератору |
TJ001 Member Откуда: от верблюда Сообщений: 428 |
Yes! That's exactly what I wanted! Спасибо! :) |
||
28 ноя 17, 16:23 [20988850] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |