Основные сведения о порядке этапов и порядке вычисления (многомерные выражения)
В ходе вычисления куба в сценарии многомерных выражений вычисление происходит за несколько шагов, в зависимости от того, для какой цели используются те или иные вычислительные функции. Каждый из этих шагов называется этапом вычисления.
Этап вычисления можно идентифицировать по его порядковому номеру — номеру этапа вычисления. Количество этапов, необходимых для полного вычисления всех ячеек куба, называется глубиной вычисления куба.
Таблица фактов и данные обратной записи обрабатываются только на этапе 0. Для каждой операции присваивания и каждой инструкции вычисления в сценарии создается новый этап. За пределами сценария многомерных выражений обращения к этапу с абсолютным номером 0 указывают на последний этап, созданный сценарием для куба.
Вычисляемые элементы создаются на всех этапах, но выражение применяется к текущему этапу. Предыдущие этапы содержат вычисляемую меру, но со значением NULL.
Порядок вычисления
Порядок вычисления определяет приоритет вычисления конкурирующих выражений. В рамках одного этапа порядок вычисления определяет две вещи.
Порядок вычисления измерений, элементов, вычисляемых элементов, пользовательских сверток и вычисляемых ячеек службами MicrosoftSQL ServerAnalysis Services.
Порядок вычисления пользовательских элементов, вычисляемых элементов, пользовательских сверток и вычисляемых ячеек службами Analysis Services.
Приоритет имеет элемент с наивысшим порядком вычисления.
Примечание |
---|
Исключением из этого правила является функция Aggregate. Порядок вычисления вычисляемых элементов с функцией Aggregate меньше, чем порядок вычисления любой пересекающейся вычисляемой меры. |
Приоритет вычислений
Приоритет вычислений определяет порядок, в котором текущая ячейка получает значения для определенного выражения. Приоритет вычислений определяется в соответствии со следующим алгоритмом.
Из всех вычислений на уровне гранулярности текущей ячейки или ниже создается список вычислений (CL).
Вычисления в списке классифицируются следующим образом: победители с высшим приоритетом (HW) и ближайшие победители (CW).
К классу CW относятся пользовательские свертки, унарные операторы, полуаддитивные меры, операция Freeze.
К классу HW относятся все остальные вычисления.
Из всех HW, упорядоченных за один проход, создается упорядоченный список вычислений (OCL).
Для каждого из оставшихся CW
Для каждого вычисления (C) в списке OCL (от самого высокого к самому низкому)
Если CW находится ближе к текущей ячейке, чем C, вставить CW в список OCL и продолжать до следующего CW
если CW находится в более высоком проходе, чем C, вставить CW в список OCL и продолжать до следующего CW.
Продолжить работать со следующим C.
Если самое высокое вычисление в списке OCL не находится на том же уровне гранулярности, что и текущая ячейка, вычисляется статистическое значение с помощью статистических функций.
Значение и приоритет порядка вычисления
Порядок вычисления может принимать значения от -8181 до 65535. Некоторые значения этого диапазона соответствуют определенным типам вычислений (см. следующую таблицу).
Вид вычисления |
Порядок вычисления |
---|---|
Нестандартные формулы элементов |
-5119 |
Унарные операторы |
-5119 |
Вычисление визуальных сумм |
-4096 |
Другие вычисления (если не указано иное) |
0 |
Настоятельно рекомендуется в качестве порядка вычисления использовать только положительные целочисленные значения. При указании значений, меньших, чем значения порядка вычисления из предыдущей таблицы, выполнение этапа вычисления может стать непредсказуемым. Пусть расчет вычисляемого элемента имеет значение порядка вычисления, меньшее, чем значение по умолчанию для пользовательской формулы свертки (-5119). Из-за более низкого значения порядка вычисления вычисляемые элементы будут рассчитываться перед пользовательскими формулами свертки, что может привести к неверному результату.
Создание и изменение порядка вычисления
Порядок вычисления для вычисляемых элементов и вычисляемых ячеек можно задать в конструкторе кубов на панели Вычисления, изменив порядок следования расчетов.
В многомерных выражениях для создания и изменения вычисляемых элементов и ячеек используется ключевое слово SOLVE_ORDER.
Примеры порядка вычисления
Чтобы проиллюстрировать потенциальную сложность работы с порядком вычисления, начнем с двух запросов, в каждом из которых проблемы определения порядка вычисления не возникает. Затем оба запроса объединяются в один, в котором требуется указание порядка вычисления.
Запрос 1 — разница в доходах и расходах
Следующий простой пример запроса многомерных выражений позволяет найти разницу доходов и расходов по каждому полугодию.
WITH
MEMBER [Time].[Year Difference] AS
[Time].[2nd half] - [Time].[1st half]
SELECT
{ [Account].[Income], [Account].[Expenses] } ON COLUMNS,
{ [Time].[1st half], [Time].[2nd half], [Time].[Year Difference] } ON ROWS
FROM Financials
В этом запросе есть только один вычисляемый элемент — Year Difference. Поскольку вычисляемый элемент только один, указание порядка вычисления не требуется, если только в кубе не используются другие вычисляемые элементы.
Запрос возвращает результирующий набор наподобие следующего.
Доходы |
Расходы |
|
---|---|---|
Первое полугодие |
5000 |
4200 |
Второе полугодие |
8000 |
7000 |
Разность за год |
3000 |
2800 |
Запрос 2 — процент чистой прибыли
Второй запрос позволяет найти процент чистой прибыли по каждому полугодию. Используется следующий запрос многомерных выражений:
WITH
MEMBER [Account].[Net Income] AS
([Account].[Income], [Account].[Expenses]) / [Account].[Income]
SELECT
{ [Account].[Income], [Account].[Expenses], [Account].[Net Income] } ON COLUMNS,
{ [Time].[1st half], [Time].[2nd half] } ON ROWS
FROM Financials
Этот запрос многомерных выражений, как и предыдущий, имеет только один вычисляемый элемент — Net Income, поэтому сложностей с порядком вычисления не возникает.
Запрос возвращает немного другой результирующий набор, наподобие следующего.
Доходы |
Расходы |
Чистая прибыль |
|
---|---|---|---|
Первое полугодие |
5000 |
4200 |
0.16 |
Второе полугодие |
8000 |
7000 |
0.125 |
Отличия результирующих наборов первого и второго запросов обусловлены тем, что вычисляемый элемент в них размещен по-разному. В первом запросе вычисляемый элемент является частью оси ROWS, а во втором — оси COLUMNS. Это отличие становится важным в следующем запросе, при объединении вычисляемых элементов в одном запросе многомерных выражений.
Запрос 3 — одновременное определение разницы доходов и расходов и чистой прибыли за год
В последнем запросе, который объединяет два первых, порядок вычисления становится важным. Чтобы гарантировать правильную последовательность вычислений, ее необходимо определить при помощи ключевого слова SOLVE_ORDER.
Ключевое слово SOLVE_ORDER указывает порядок вычисления вычисляемых элементов в запросе многомерных выражений или в команде CREATE MEMBER. Целые значения, заданные при помощи ключевого слова SOLVE_ORDER, являются относительными, они не обязательно должны начинаться с нуля и следовать друг за другом. В многомерных выражениях они лишь сообщают, что элементы следует рассчитывать на основе значений, полученных при расчете других элементов с более высоким порядком разрешения. Если в определении вычисляемого элемента не указано ключевое слово SOLVE_ORDER, значением порядка разрешения по умолчанию для этого вычисляемого элемента является ноль.
Например, если объединить вычисления двух первых запросов многомерных выражений в один, два вычисляемых элемента — Year Difference и Net Income — пересекаются в одной ячейке результирующего набора данных в примере запроса многомерных выражений. Единственным способом определения последовательности вычисления службами Analysis Services значения этой ячейки является указание порядка вычисления. Формулы, используемые для расчета значения этой ячейки, возвращают различные результаты в зависимости от указанного порядка вычисления данных вычисляемых элементов.
Для начала объединим вычисления из предыдущих двух примеров в следующий запрос многомерных выражений:
WITH
MEMBER [Time].[Year Difference] AS
'[Time].[2nd half] - [Time].[1st half],
SOLVE_ORDER = 1
MEMBER [Account].[Net Income] AS
'([Account].[Income] - [Account].[Expenses]) / [Account].[Income]',
SOLVE_ORDER = 2
SELECT
{ [Account].[Income], [Account].[Expenses], [Account].[Net Income] } ON COLUMNS,
{ [Time].[1st half], [Time].[2nd half], [Time].[Year Difference] } ON ROWS
FROM Financials
В этом запросе многомерных выражений формула Net Income имеет наивысший порядок вычисления, поэтому имеет приоритет при пересечении двух выражений. Службы Analysis Services вычисляют значение ячейки по формуле Net Income. Результат этих вложенных вычислений приведен в следующей таблице.
Доходы |
Расходы |
Чистая прибыль |
|
---|---|---|---|
Первое полугодие |
5000 |
4200 |
0.16 |
Второе полугодие |
8000 |
7000 |
0.125 |
Разность за год |
3000 |
2800 |
0.066 |
Результат общей ячейки вычисляется по формуле Net Income. Другими словами, Analysis Services вычисляет результат общей ячейки с данными Year Difference по следующей формуле (для удобства результат округляется):
((8000 - 5000) - (7000 - 4200)) / (8000 - 5000) = 0.066
или
(3000 - 2800) / 3000 = 0.066
Однако если в запросе многомерных выражений изменен порядок вычисления вычисляемых элементов, службы Analysis Services вычисляют результат общей ячейки по-другому. В следующем объединенном запросе многомерных выражений порядок вычисления вычисляемых элементов изменен на обратный.
WITH
MEMBER [Time].[Year Difference] AS
'[Time].[2nd half] - [Time].[1st half],
SOLVE_ORDER = 2
MEMBER [Money].[Net Income] AS
'([Money].[Income] - [Money].[Expenses]) / [Money].[Income]',
SOLVE_ORDER = 1
SELECT
{ [Money].[Income], [Money].[Expenses], [Money].[Net Income] } ON COLUMNS,
{ [Time].[1st half], [Time].[2nd half], [Time].[Year Difference] } ON ROWS
FROM TestCube
Поскольку порядок разрешения вычисляемых элементов изменен, для вычисления значения ячейки службы Analysis Services будут использовать формулу Year Difference, что приведет к следующим результатам.
Доходы |
Расходы |
Чистая прибыль |
|
---|---|---|---|
Первое полугодие |
5000 |
4200 |
0.16 |
Второе полугодие |
8000 |
7000 |
0.125 |
Разность за год |
3000 |
2800 |
-0.035 |
Поскольку в этом запросе в формулу Year Difference подставляются данные Net Income, формулу общей ячейки можно записать следующим образом:
((8000 - 7000) / 8000) - ((5000 - 4200) / 5000) = -0.035
или
0.125 - 0.16 = -0.035
Дополнительные сведения
Работать с порядками вычисления весьма сложно, особенно в кубах с большим количеством измерений, содержащих вычисляемые элементы, пользовательские формулы сверток и вычисляемые ячейки. При выполнении службами Analysis Services запроса многомерных выражений принимается во внимание порядок вычисления всех элементов, рассчитываемых на данном этапе, включая измерения куба, указанные в запросе.