Общие сведения о порядке прохождения и порядке вычисления (MDX)

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

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

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

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

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

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

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

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

Участник с самым высоким приоритетом решения задач имеет преимущество.

Замечание

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

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

Значения порядка решения могут варьироваться от -8181 до 65535. В этом диапазоне некоторые значения порядка решения соответствуют определенным типам вычислений, как показано в следующей таблице.

Расчет Порядок решения
Пользовательские формулы элементов -5119
Унарные операторы -5119
Визуальный расчет итогов -4096
Все остальные вычисления (если не указано в противном случае) 0

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

Создание и изменение порядка решения

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

В многомерных выражениях можно использовать ключевое SOLVE_ORDER слово для создания или изменения вычисляемых элементов и вычисляемых ячеек.

Примеры порядка решения

Чтобы проиллюстрировать потенциальные сложности порядка решения, следующий ряд запросов многомерных выражений начинается с двух запросов, которые каждый отдельно не имеет проблем с заказом. Эти два запроса затем объединяются в запрос, требующий порядка решения.

Замечание

Вы можете выполнять эти MDX-запросы для примера многомерной базы данных Adventure Works. Вы можете скачать пример Многомерных моделей AdventureWorks SQL Server 2012 с сайта Codeplex.

Запрос 1-различия в доходах и расходах

Для первого запроса многомерных выражений вычислите разницу в продажах и затратах за каждый год, создав простой запрос многомерных выражений, аналогичный следующему примеру:

WITH   
MEMBER  
[Date].[Calendar].[Year Difference] AS ([Date].[Calendar].[Calendar Year].&[2008] - [Date].[Calendar].[Calendar Year].&[2007] )  
SELECT   
{[Measures].[Internet Sales Amount], [Measures].[Internet Total Product Cost] }  
ON COLUMNS ,  
{ [Date].[Calendar].[Calendar Year].&[2007], [Date].[Calendar].[Calendar Year].&[2008], [Date].[Year Difference] }  
ON ROWS  
FROM [Adventure Works]  

В этом запросе существует только один вычисляемый элемент Year Difference. Так как существует только один вычисляемый элемент, порядок решения не является проблемой, если куб не использует вычисляемые элементы.

Этот MDX-запрос создает набор данных, похожий на таблицу, приведенную ниже.

Сумма интернет-продаж Общая стоимость продукта в Интернете
CY 2007 $9,791,060,30 $5,718,327.17
CY 2008 $9,770,899,74 $5,721,205.24
Разница в году ($20,160,56) $2,878,06

Запрос: процент дохода после расходов

Для второго запроса вычислите процент дохода после расходов за каждый год с помощью следующего запроса многомерных выражений:

WITH   
MEMBER  
[Measures].[Profit Margin] AS   
([Measures].[Internet Sales Amount] - [Measures].[Internet Total Product Cost] ) / [Measures].[Internet Sales Amount] ,  
FORMAT_STRING="Percent"  
SELECT   
{[Measures].[Internet Sales Amount], [Measures].[Internet Total Product Cost], [Measures].[Profit Margin] }  
ON COLUMNS ,  
{ [Date].[Calendar].[Calendar Year].&[2007], [Date].[Calendar].[Calendar Year].&[2008] }  
ON ROWS  
FROM [Adventure Works]  

Этот запрос MDX, как и предыдущий, имеет только один вычисляемый элемент, Profit Margin, и поэтому не имеет никаких осложнений порядка решения.

Этот MDX запрос создает немного другой набор результатов, аналогичный следующей таблице.

Сумма интернет-продаж Общая стоимость продукта в Интернете Рентабельность
CY 2007 $9,791,060,30 $5,718,327.17 41.60%
CY 2008 $9,770,899,74 $5,721,205.24 41.45%

Разница в результирующих наборах между первым запросом и вторым запросом происходит из разницы в размещении вычисляемого элемента. В первом запросе вычисляемый элемент является частью оси ROWS, а не оси COLUMNS, показанной во втором запросе. Эта разница в размещении становится важной в следующем запросе, который объединяет два вычисляемых члена в одном MDX-запросе.

Запрос 3 — Расчет Сочетанной Разницы Года и Чистого Дохода

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

Ключевое SOLVE_ORDER слово указывает порядок выполнения вычисляемых элементов в MDX-запросе или в команде CREATE MEMBER. Целые значения, используемые с SOLVE_ORDER ключевым словом, являются относительными, не нужно начинать с нуля и не должны быть последовательными. Значение указывает MDX на вычисление элемента на основе значений, полученных в результате вычисления элементов с более высоким уровнем значений. Если вычисляемый элемент определен без SOLVE_ORDER ключевого слова, значение по умолчанию вычисляемого элемента равно нулю.

Например, если объединить вычисления, используемые в первых двух примерах запросов, то два вычисляемых элемента Year Difference и Profit Margin пересекаются в одной ячейке в результирующем наборе данных примера запроса MDX. Единственный способ определить, как службы Analysis Services будут оценивать эту ячейку, — это порядок решения. Формулы, используемые для создания этой ячейки, будут получать разные результаты в зависимости от порядка решения двух вычисляемых элементов.

Сначала попробуйте объединить вычисления, используемые в первых двух запросах, в следующем многомерном запросе:

WITH   
MEMBER  
[Date].[Calendar].[Year Difference] AS ([Date].[Calendar].[Calendar Year].&[2008] - [Date].[Calendar].[Calendar Year].&[2007] ) ,  
SOLVE_ORDER = 1  
MEMBER  
[Measures].[Profit Margin] AS   
( [Measures].[Internet Sales Amount] - [Measures].[Internet Total Product Cost] ) / [Measures].[Internet Sales Amount] ,  
FORMAT_STRING="Percent" ,  
SOLVE_ORDER = 2  
SELECT   
{[Measures].[Internet Sales Amount], [Measures].[Internet Total Product Cost], [Measures].[Profit Margin] }  
ON COLUMNS ,  
{ [Date].[Calendar].[Calendar Year].&[2007], [Date].[Calendar].[Calendar Year].&[2008], [Date].[Year Difference] }  
ON ROWS  
FROM [Adventure Works]  

В этом объединенном примере MDX-запроса у Profit Margin самый высокий порядок обработки, поэтому он имеет приоритет, когда два выражения взаимодействуют. Службы Analysis Services оценивают рассматриваемую ячейку с помощью формулы Profit Margin. Результаты вложенного вычисления показаны в следующей таблице.

Сумма интернет-продаж Общая стоимость продукта в Интернете Рентабельность
CY 2007 $9,791,060,30 $5,718,327.17 41.60%
CY 2008 $9,770,899,74 $5,721,205.24 41.45%
Разница в году ($20,160,56) $2,878,06 114.28%

Результат в общей ячейке основан на формуле для Profit Margin. То есть службы Analysis Services вычисляют результат в общей ячейке с Year Difference данными, создавая следующую формулу (результат округляется для ясности):

((9,770,899.74 - 9,791,060.30) - (5,721,205.24 - 5,718,327.17)) / (9,770,899.74 - 9,791,060.30) = 1.14275744   

или

(23,038.63) / (20,160.56) = 114.28%  

Это явно неправильно. Однако в службах Analysis Services результат в общей ячейке вычисляется по-другому, если изменить порядок решения для вычисляемых элементов в запросе MDX. Следующий комбинированный запрос MDX изменяет порядок вычисления для вычисляемых членов.

WITH   
MEMBER  
[Date].[Calendar].[Year Difference] AS ([Date].[Calendar].[Calendar Year].&[2008] - [Date].[Calendar].[Calendar Year].&[2007] ) ,  
SOLVE_ORDER = 2  
MEMBER  
[Measures].[Profit Margin] AS   
( [Measures].[Internet Sales Amount] - [Measures].[Internet Total Product Cost] ) / [Measures].[Internet Sales Amount] ,  
FORMAT_STRING="Percent" ,  
SOLVE_ORDER = 1  
SELECT   
{[Measures].[Internet Sales Amount], [Measures].[Internet Total Product Cost], [Measures].[Profit Margin] }  
ON COLUMNS ,  
{ [Date].[Calendar].[Calendar Year].&[2007], [Date].[Calendar].[Calendar Year].&[2008], [Date].[Year Difference] }  
ON ROWS  
FROM [Adventure Works]  

Так как порядок вычисляемых элементов был изменён, Analysis Services используют формулу Year Difference для вычисления ячейки, как показано в следующей таблице.

Сумма интернет-продаж Общая стоимость продукта в Интернете Рентабельность
CY 2007 $9,791,060,30 $5,718,327.17 41.60%
CY 2008 $9,770,899,74 $5,721,205.24 41.45%
Разница в году ($20,160,56) $2,878,06 (0.15%)

Так как этот запрос использует формулу Year Difference с Profit Margin данными, формула для общей ячейки напоминает следующее вычисление:

(($9,770,899.74 - 5,721,205.24) / $9,770,899.74) - ((9,791,060.30 - 5,718,327.17) / 9,791,060.30) = -0.15   

или

0.4145 - 0.4160= -0.15  

Дополнительные рекомендации

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

См. также

CalculationCurrentPass (MDX)
CalculationPassValue (MDX)
Инструкция CREATE MEMBER (MDX)
Работа с данными (MDX)