Управление моделями SSAS через СУБД
Настройте связанный сервер на SSAS модель (доверительное соединение) и команда Exec At позволит запускать все виды запросов возможные для SSAS сервера. Такие как:
- Обновление секций, моделей в целом
- Изменение схем модели
- Получение детальной информации по серверу SSAS и его моделям
Пример обновления заданных секций модели
В данном примере таблица фактов модели разделена на секции по датам по полгода. Формат наименования секций стандартизирован (пример наименования секции fcts_2018-01_2018-06). Чтобы можно было вычислять даты, которые доступны в секции.
Хранимая процедура на вход принимает период дат, которые необходимо обновить в модели. Если передать даты 29.12.2020 и 04.03.2021, то процедура должна обновить две секции: второе полугодие 20 года и первое полугодие 21 года.
Запросы DMV помогут получить список секций модели.
--сбор секций declare @partitions as table ( [name] nvarchar(150)) set @script = 'SELECT * FROM OPENQUERY ( [linkedservername] , ''select [name] from $SYSTEM.TMSCHEMA_partitions where tableid=25'' )' insert into @partitions ( [name] ) exec sp_executeSQL @script
Теперь в табличной переменной @partitions хранятся имена секции таблицы фактов. Для выполнения этого запроса необходимо знать идентификатор таблицы фактов. В этом помогут запросы к $SYSTEM.TMSCHEMA_MODELS и $SYSTEM.TMSCHEMA_TABLES. Их можно выполнить на самом SSAS сервере. Это разовая операция.
Далее из списка @partitions удаляются лишние наименования секций, не входящие в заданный параметрами диапазон. С помощью for json PATH можно получить список объектов для подстановки в XMLA схему обновления:
Declare @objectsxmla as nvarchar(max)=(select 'ModelName' [database], 'TableFactName' [table], name [partition] from @partitions for json PATH
Declare @ChangePartXmla as nvarchar(max)
SET @ChangePartXmla =
'{
"sequence": {
"maxParallelism": '+cast(@parallelism as nvarchar(2)) +',
"operations": [{
"refresh": {
"type": "full",
"objects":'+
@objectsxmla
+'}
}
]
}
}'
Exec (@ChangePartXmla) At [linkedservername]Обратите внимание на свойство maxParallelism. Оно позволяет указать возможность параллельной обработки секций. Если поставить 1, то секции будут обрабатываться последовательно, соответственно дольше. Задайте число в зависимости от возможностей вашего сервера.