SSAS
September 26, 2021

Управление моделями 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, то секции будут обрабатываться последовательно, соответственно дольше. Задайте число в зависимости от возможностей вашего сервера.