Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как правильно организовать кэширование отчета SSRS?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 408
Исходные данные:
Есть отчет, который достаточно долго собирает данные, но результирующй набор очень мал < 2000 строк.
Актуальность отчета - сутки, т.е. в течение суток он будет показывать всем одни и те же данные.
Между пользователями разница лишь в том, что они смотрят данные с разными фильтрами (в зависимости от уровня доступа) - одним доступно все, другим только часть, третьим другая часть.
Число пользователей около 100.

Задача:
снизить нагрузку на сервер, повысить быстродействие.

Может быть это костыль, но хочу сделать кэширование, которое работает так:
Любой первый пользователь, запустивший отчет в новом дне, заполняет кэш. Т.е. отчет это делает автоматически.
В датасете написано: если в таблице 1 есть данные за период от Дата1 по Дата2 + другие фильтры, то взять данные из таблицы 1, если данных нет, то запустить ряд запросов:
  • очистить таблицу 1 от старых данных (удалить все, что меньше Дата2)
  • выполнить запрос, который соберет результирующие данные с максимальным доступом и без учета фильтров (т.е. не только те, что ему разрешено смотреть и независимо от выставленных у него фильтров) и поместит их в таблицу 1
  • выполнит запрос к таблице 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]     Ответить | Цитировать Сообщить модератору
     Re: Как правильно организовать кэширование отчета SSRS?  [new]
    buser
    Member

    Откуда: Санкт-Петербург
    Сообщений: 4537
    TJ001, вариант с джобой неплох... а так sp_getapplock/sp_releaseapplock
    28 ноя 17, 11:29    [20987786]     Ответить | Цитировать Сообщить модератору
     Re: Как правильно организовать кэширование отчета SSRS?  [new]
    Yasha123
    Member

    Откуда:
    Сообщений: 1833
    что-то у вас все как-то сложно.
    у нас ровно те же требования:
    Актуальность отчета - сутки, т.е. в течение суток он будет показывать всем одни и те же данные.
    отчет собирается 1 раз в процедуре, процедура кладет результат в таблицу.
    эта процедура, как и туча других, есть часть ночного джоба.
    джоб заполняет необходимые таблицы в схеме staging.
    каждая таблица имеет колонку datarif, это та дата, на которую собран отчет.
    последняя инструкция в джобе это переключение всех стэйджинговых таблиц в dbo,
    в сингл юзере
    28 ноя 17, 11:39    [20987826]     Ответить | Цитировать Сообщить модератору
     Re: Как правильно организовать кэширование отчета SSRS?  [new]
    Владислав Колосов
    Member

    Откуда:
    Сообщений: 7754
    TJ001,

    так заполняйте свой "куб" в нерабочее время по расписанию.
    28 ноя 17, 11:40    [20987828]     Ответить | Цитировать Сообщить модератору
     Re: Как правильно организовать кэширование отчета SSRS?  [new]
    TJ001
    Member

    Откуда: от верблюда
    Сообщений: 408
    buser
    sp_getapplock/sp_releaseapplock

    Yes! That's exactly what I wanted!

    Спасибо! :)
    28 ноя 17, 16:23    [20988850]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить