Поделиться через


Основные сведения о порядке этапов и порядке вычисления (многомерные выражения)

В ходе вычисления куба в сценарии многомерных выражений вычисление происходит за несколько шагов, в зависимости от того, для какой цели используются те или иные вычислительные функции. Каждый из этих шагов называется этапом вычисления.

Этап вычисления можно идентифицировать по его порядковому номеру — номеру этапа вычисления. Количество этапов, необходимых для полного вычисления всех ячеек куба, называется глубиной вычисления куба.

Таблица фактов и данные обратной записи обрабатываются только на этапе 0. Для каждой операции присваивания и каждой инструкции вычисления в сценарии создается новый этап. За пределами сценария многомерных выражений обращения к этапу с абсолютным номером 0 указывают на последний этап, созданный сценарием для куба.

Вычисляемые элементы создаются на всех этапах, но выражение применяется к текущему этапу. Предыдущие этапы содержат вычисляемую меру, но со значением NULL.

Порядок разрешения

Порядок разрешения определяет приоритет вычисления конкурирующих выражений. В рамках одного этапа порядок разрешения определяет две вещи.

  • Порядок вычисления измерений, элементов, вычисляемых элементов, пользовательских сверток и вычисляемых ячеек службами Microsoft SQL Server Службы Analysis Services.

  • Порядок вычисления пользовательских элементов, вычисляемых элементов, пользовательских сверток и вычисляемых ячеек службами Службы Analysis Services.

Приоритет имеет элемент с наивысшим порядком разрешения.

ПримечаниеПримечание

Исключением из этого правила является функция Aggregate. Порядок разрешения вычисляемых элементов с функцией Aggregate меньше, чем порядок разрешения любой пересекающейся вычисляемой меры.

Значение и приоритет порядка разрешения

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