Обработка данных многомерных выражений (MDX) — понимание порядка проходов и порядка решения

Применимо к: SQL Server Analysis Services Azure Analysis Services Fabric/Power BI Premium

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

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

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

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

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

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

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

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

Член с наивысшим порядком решения обладает приоритетом.

Замечание

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

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

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

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

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

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

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

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

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

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

Запрос 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

Запрос 2 — Процент дохода после расходов

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

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

В этом примере объединенного запроса многомерных выражений Profit Margin имеет самый высокий порядок выполнения, поэтому он имеет приоритет, когда два выражения взаимодействуют. SQL Server 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. То есть SQL Server 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%  

Это явно неправильно. Однако службы SQL Server 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]  

После изменения порядка вычисляемых элементов SQL Server 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   

Or

0.4145 - 0.4160= -0.15  

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

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

См. также

CalculationCurrentPass (MDX)
CalculationPassValue (MDX)
Инструкция CREATE MEMBER (MDX)
Управление данными (многомерные выражения)