вторник, 10 июня 2014 г.

Секционирование(Partitioning) OLAP-кубов в SSAS 2008 R2


Секции являются эффективным и гибким средством управления кубами, особенно крупными. Например, куб, содержащий данные о продажах, может содержать секции для каждого прошедшего года, а также секции для каждого квартала текущего года. При добавлении в куб текущих данных необходимо обрабатывать только текущую  четверть секции. Обработка меньшего количества данных улучшит производительность обработки за счет уменьшения времени обработки. В конце года четыре квартальные секции могут быть объединены в одну, годовую секцию, а для первого квартала нового года создается новая секция. В дальнейшем этот процесс создания новой секции может быть автоматизирован как часть загрузки хранилища данных и процедур обработки куба.
Как уже упоминалось выше, в целях повышения производительности работы кубов, в SSAS предусмотрена возможность разбиения групп мер на секции(Partitions).
При больших объемах данных секционирование  может значительно уменьшить время обработки, а так же уменьшит время обращения к кубу, особенно если секции разнести по разным физическим носителям.
Создать секции можно как в SQL Server Management Studio(SSMS), так и в Business Intelligence Development Studio(BIDS). Рекомендуется создавать  секции в BIDS, т.к. если их сделать в SSMS, т.е. на рабочем кубе, а не в проекте, то при следующем развертывании(Deploy) куба все секции удаляться. Для создания секций в BIDS необходимо в дизайнере куба открыть вкладку «Секции»(Partitions):
Здесь можно увидеть группы мер, список их секций и режимы хранения(подробнее о режимах хранения здесь http://msdn.microsoft.com/ru-ru/library/ms174915(v=sql.105).aspx ).
Для того, что бы разбить на секции группу мер, необходимо сначала изменить текущую секцию. Разбивать на секции будем по дате. Для этого в колонке «Источник»(Source) для секции нажимаем кнопку, которая появляется при получении этим полем фокуса ввода. Появиться окно:
 По умолчанию «Тип привязки»(Binding type) выбран «Привязка таблицы»(Table Binding). Меняем его на «Привязка запроса»(Query Binding),  в окне появиться поле с SQL-запросом, который используется для обращения к базе при обработке куба, с пустым условием WHERE. Так как текущая секция будет обрабатываться каждый день, в условие добавляем выражение для секционирования:
WHERE date >= '2014-06-01'
Перед тем как нажмем кнопку «OK», можно проверить синтаксис введенного запроса, для этого нажимаем «Проверка». Если введенный запрос верен, BIDS  выдаст сообщение «Проверка синтаксиса прошла успешно». Подтверждаем свои намерения нажатием кнопки «ОК», текущая секция создана. Далее необходимо создать секцию (или несколько секций) для исторических данных.
 Для создания секции нажимаем ссылку «Создать секцию»(New Partition). Появиться окно мастера секционирования. Нажимаем «Далее». В появившемся окне поля «Группа мер» и «Источник секций» оставляем с данными определенными по умолчанию. Выбираем таблицу в поле «Доступные таблицы»(Available tables), нажимаем «Далее»
 Появиться окно, где вводиться запрос, в нем отмечаем флажком «Укажите запрос для ограничения строк»(Specify a query to restrict rows) и в запросе пишем условие ограничения:
WHERE date BETWEEN '2013-01-01' AND '2014-05-31' 
 нажимаем «Далее», появиться окно где можно настроить опции «Обработка местоположения» (Processing loaction) и «Место хранения»(Storage location) (т.е. где будут физически лежать файлы для этой секции).  Отмечаем «Указанная папка», и выбираем предварительно созданную папку, если есть возможность разместить данные на более «шустром» локальном или удаленном жестком диске(HDD). 
Подтверждаем место хранения кнопкой «ОК» и в следующем окне нажимаем «Далее».
Иначе оставляем «Место хранения» по умолчанию «Расположение сервера по умолчанию».
В продолжение сценария мастера секционирования, появиться окно, где в поле «Имя»(Name) указываем название секции,  в «Параметры статистической обработки» выбираем пункт «Создать статистические схемы позже»(Design aggregations later) остальное оставляем без изменений и нажимаем «Готово»
 Далее разворачиваем и обрабатываем куб, а в повседневной работе куба,  обрабатываем только секцию с текущими данными, т.к. данные будут обновляться только в ней.
Теперь рассмотрим  подробнее о процессе и типах обработки куба.
Самый удачный, на мой взгляд, процесс обработки куба, это разбиение его на шаги:
1. ProcessUpdate или (ProcessData + ProcessIndexes) обработка измерений;
2. ProcessFull обработка последней секции или инкрементальная(ProcessAdd) для последних данных, если секция большая;
3. ProcessIndexes для остальных секций.
Если использовать ProcessAdd для секции, то важно следить, чтобы вы не добавили одни и те же данные 2 раза в эту секцию. При выполнении XMLA команды ProcessAdd вы передаете скрипит, для вытягивания данных из источника с условиями (например по дате, за вчерашний день). Если вы 5 раз запустите эту XMLA команду, вы 5 раз добавите эти данные в куб.
Что же касается типов обработки, то опишем часто используемые (полный список на http://technet.microsoft.com/ru-ru/library/ms174774(v=sql.105).aspx):
Обработка. По умолчанию (ProcessDefault)
Определяет состояние обработки объекта и выполняет обработку, необходимую для того, чтобы преобразовать необработанные или частично обработанные объекты в полностью обработанное состояние. Данный режим обработки поддерживается для кубов, баз данных, измерений, групп мер, секций, а также моделей и структур интеллектуального анализа.
Обработка. Полная(ProcessFull)
Обрабатывает объект служб Службы Analysis Services и все объекты, которые в нем содержатся. Когда объект, который обрабатывается методом полной обработки, уже был обработан, службы Службы Analysis Services сбрасывают все данные объекта и затем обрабатывают его. Данный тип обработки необходим в том случае, если в объекте произошли структурные изменения, например добавлена, удалена или переименована иерархия атрибута. Данный режим обработки поддерживается для кубов, баз данных, измерений, групп мер, секций, а также моделей и структур интеллектуального анализа.
Обработка. Добавочная(ProcessAdd)
Добавляет новые данные фактов и выполняет обработку только для соответствующих секций. Данный режим обработки поддерживается для групп мер и секций.
Обработка. Обновление(ProcessUpdate)
Выполняет повторное  чтение данных и обновляет атрибуты измерения. Гибкие агрегаты и индексы связанных секций будут сброшены. Например, при помощи этого режима обработки можно добавить новые элементы в измерение и принудительно выполнить повторное чтение всех данных для обновления атрибутов объектов. Данный режим обработки поддерживается для измерений.
Обработка. Индекс(ProcessIndexes)
 Создает или перестраивает индексы и агрегаты для всех обработанных секций. При применении к необработанным объектам выдает ошибку. Данный режим обработки поддерживается для измерений, групп мер и секций.
Обработка. Данные(ProcessData)
Обрабатывает только данные без построения статистических схем или индексов. Если данные находятся в секциях, они будут сброшены перед повторным заполнением секции исходными данными. Данный режим обработки поддерживается для измерений, кубов, групп мер и секций.

Теперь определившись с вариантом обработки измерений и секций куба, необходимо получить XMLA-скрипты  для постановки планировщика заданий в SSMS по расписанию.
Как это сделать  уже было подробно описано(см. Обновление OLAP-кубов в SQL Server AnalysisServices(SSAS)  по расписанию)
Сейчас рассмотрим аналогичную задачу отличием,  которой будет только то, что задание будет содержать шаги с обработкой измерений и обработкой не всего куба, а только необходимых секций.
Подключитесь к экземпляру служб Analysis Services в среде SQL Server Management Studio (SSMS) ,  раскройте узел «Базы данных», далее раскройте необходимую БД и соответствующие ей «Измерения», щелкните правой кнопкой мыши  по наименованию измерения которое  хотите обрабатывать  и выберите команду «Обработка»(подробно здесь).
В раскрывшемся окне выберите «Параметры обработки»  - Обработка. Обновление (ProcessUpdate)
 С помощью функции «Сценарий» получаем  уже известным методом XMLA-скрипты  всех необходимых измерений.
Аналогично получаем XMLA-скрипты для текущих секций куба с  Параметром обработки - Обработка. Полная(ProcessFull).

Таким же образом получаем XMLA-скрипты для архивных секций куба с  Параметром обработки - Обработка. Индекс (ProcessIndexes).
Далее(уже известным методом) создаем последовательность шагов в расписании и получаем автоматическую обработку куба по расписанию с последовательным выполнением шагов:
1. ProcessUpdate обработка измерений;
2. ProcessFull обработка текущей секции;
3. ProcessIndexes для остальных секций.

Ресурсы, которые использовались при написании статьи:

четверг, 21 ноября 2013 г.

Обновление OLAP-кубов в SQL Server Analysis Services(SSAS) по расписанию



Для обновления OLAP-кубов можно использовать SSIS или Sql Server Agent. В SSIS есть уже готовый  компонент с различными настройками для обновления куба, но в  данном примере речь пойдет о Sql Server Agent .
Изначально необходимо подготовить XMLA-скрипты для дальнейшего их использования в задании Sql Server Agent.
Использование среды SQL Server Management Studio(SSMS)  для создания XMLA-скрипта.
В среде Среда SQL Server Management Studio (SSMS ) подключитесь к экземпляру служб Analysis Services:

Раскройте узел «Базы данных», далее раскройте необходимую БД и соответствующий ей куб , щелкните правой кнопкой мыши  по наименованию куба который хотите обрабатывать  и выберите команду «Обработать»:
В открывшемся диалоговом окне «Обработка куба» нажмите кнопку «Сценарий» в верхней части диалогового окна. Функция «Сценарий»  является частью всех диалоговых окон, относящихся к задачам, в среде Management Studio. Она имеет следующие параметры. Вариант «Записать действие в новом окне запроса»  открывает окно редактора запросов, вариант «Записать сценарий  в файл» сохраняет XMLA - скрипт в файл, а вариант «Записать сценарий  в буфер» сохраняет XMLA - скрипт в буфер обмена. Выберите  «Записать сценарий в файл» и сохраните  его для дальнейшего использования:
 
Теперь вы можете закрыть диалоговое окно «Обработка куба».
Записанный фал будет содержать необходимый XMLA-скрипт приблизительно такого содержания:
<Batch xmlns="http://schemas.microsoft.com/analysisservices/2003/engine">
  <Parallel>
    <Process ……mlns:ddl200_200="http://schemas.microsoft.com......>
      <Object>
        <DatabaseID> ID_базы_данных </DatabaseID>
        <CubeID>Имя_куба</CubeID>
      </Object>
      <Type>ProcessFull</Type>
      <WriteBackTableCreation>UseExisting</WriteBackTableCreation>
    </Process>
  </Parallel>
</Batch>
Аналогичным образом можно получить скрип для обработки всех Измерений и объединить их в один Batch для обработки перед основной обработкой куба, но это уже зависит от поставленной задачи.

Агент SQL Server
Агент SQL Server — это служба Microsoft Windows, выполняющая запланированные административные задачи, которые называются заданиями в SQL Server 2008R2.
Агент SQL Server использует SQL Server для хранения сведений о заданиях. Задание состоит из одного или нескольких шагов. Каждый шаг содержит собственную задачу, например создание резервной копии базы данных или обновления куба как в нашем примере.
Агент SQL Server может выполнять задания по расписанию в ответ на определенное событие или по требованию.
Использование среды SQL Server Management Studio
Создание задания
В обозревателе объектов установите соединение с экземпляром компонента Компонент Database Engine:
и разверните его.
Раскройте узел Агент SQL Server, щелкните правой кнопкой мыши узел «Задания» и выберите «Создать задание»:


В поле «Имя» введите имя нового задания:

 
Если не нужно, чтобы задание вступило в силу немедленно после создания, снимите флажок Включено.
Далее необходимо перейти на страницу «Шаги», и создать новый шаг:
 
В свойствах «Общие» укажите имя шага, в поле «Тип»  выберите  Команда служб SQl Server  Analysis Services, укажите сервер, ниже в поле «Команда» вставьте ранее сохраненный  XMLA – скрипт:
Перейдите на свойство «Дополнительно» и заполните, при необходимости, поля «Действие при успехе», «Повторные попытки», их «Интервал», «Действие при ошибке» и т.д.
Создав необходимые шаги, перейдите на создание «Расписания». Выберите одно из следующих значений для параметра «Тип расписания». Чтобы запускать задание, когда процессоры переходят в состояние бездействия, щелкните «Запускать при бездействии процессоров». Если необходимо периодическое выполнение расписания, выберите пункт «Повторяющееся задание». Затем в диалоговом окне заполните группы «Частота», «Сколько раз в день» и «Продолжительность».
Если планируется однократное выполнение, выберите «Один раз». Для установки расписания «Один раз» заполните в диалоговом окне группу «Однократное выполнение».
Остальные страницы задания(«Предупреждения», «Уведомления», «Цели»)  создайте и настройте при необходимости.
Подтверждаем создание Задания кнопкой «ОК», задание создано и запланирована обработка куба по расписанию.