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


Повышение производительности многомерных выражений в службах SQL Server 2008 Analysis Services

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

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

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

Ниже приводятся сценарии и ситуации при написании кода, которых при пересмотре кода следует избегать, так как они могут не позволить инструкциям многомерных выражений достичь ожидаемого улучшения производительности служб SQL Server 2008 Analysis Services (SSAS). Однако, если изменить существующий код с целью обхода перечисленных ситуаций невозможно, производительность кода многомерных выражений должна остаться на том же уровне, что и в службах SQL Server 2005 Analysis Services (SSAS).

Полезные определения

Место на диске

Набор ячеек, по которым оценивается выражение.

Произвольная форма

Пространство, которое невозможно представить в виде перекрестного соединения нескольких наборов. Например, пространство {(Drink, USA), (Food, Canada)} представляет собой произвольную форму, поскольку является подмножеством перекрестного соединения {Drink, Food} * {USA, Canada} = {(Drink, USA), (Drink, Canada), (Food, USA), (Food, Canada)}.

Статическое выражение

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

Например, в области CrossJoin(Product.Members, Customer.Members) неизменяемыми являются следующие выражения:

  • 1, константное выражение;

  • Product.Members.Count

Динамическое выражение

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

Например, в области CrossJoin(Product.Members, Customer.Members) динамическими являются следующие выражения.

  • Sales, поскольку эта мера, значения которой во всех клетках пространства различны.

Переменный атрибут

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

Как правило, переменные атрибуты позволяют сократить пространство оценки выражений. Обратите внимание на следующее выражение.

with member measures.x as Customers.Geography.currentmember.uniquename

Select Customers.Geography.City.members on 0,

Product.members on 1

From sales

Where measures.x

В данном примере параметр Customers.Geography является статическим выражением. Функция currentmember является переменным атрибутом, поскольку представляет зависимость от атрибута «Город». Uniquename не добавляет переменных атрибутов, так как находится в связи «один к одному» с атрибутом currentmember. Таким образом, вычисление выражения uniquename выполняется один раз для заказчика и не повторяется для каждого значения атрибута Product. Следовательно, пространство всего выражения посредством переменного атрибута сокращается.

Использование выражений в незначимых свойствах ячейки

Ни на каких многомерных выражениях, используемых для присвоения значения незначимого свойства ячейки, усовершенствование производительности не отразится. Производительность останется на уровне служб SQL Server 2005 Analysis Services (SSAS).

Использование прочих функций

Ни на каких других функциях, не перечисленных в данном документе и использованных в коде многомерных выражений, ожидаемое повышение производительности данной версии продукта не отразится. См. раздел Functions with enhanced performance данного документа.

Применение безопасности ячеек

Определение безопасности ячеек в области вычисления многомерного выражения препятствует повышению производительности кода.

Зависимость между безопасностью ячеек и производительностью представлена в следующей таблице.

Безопасность ячеек

Ожидаемая производительность

нет

Оптимальная

Чтение

Посредственная

Производное чтение

Минимальная

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

Использование динамической размерности

Использование динамической размерности при работе с кодом многомерных выражений препятствует повышению производительности. Так, например, на выражениях, подобных Sum( IIF( Sales > 10000, h1.Members, h2.Members)), улучшение производительности не отразится, поскольку при вычислении выражения Sales в коде изменяются суммируемые элементы. Другим примером служит сценарий, в котором для сравнения с эквивалентным значением параллельного периода необходимо использовать элементы иерархий либо календарного, либо финансового года в зависимости от атрибута, принадлежащего текущему элементу атрибута счета. Многомерное выражение, необходимое для такого сценария, будет похоже на следующий образец кода:

ParallelPeriod(Iif( Account.CurrentMember.Properties("UsesFiscalCalendar")="Y", FiscalTime, CalendarTime).CurrentMember)

Опять же, измерения изменяются динамически, поскольку изменяется текущий элемент измерения счетов.

Использование динамических параметров

Использование динамических параметров при работе с кодом многомерных выражений препятствует повышению производительности. Например, выражение типа KpiGoal("Sales_" & [Fiscal Year].currentmember.UniqueName) принимает различные значения в ячейках, для которых оно вычисляется, тогда как выражение KpiGoal("Sales_" & Cstr(Year(Now))) остается неизменным.

Важное примечаниеВажно!

Может получиться так, что на всей области вычисления оценка выражения KpiGoal("Sales_" & [Fiscal Year].currentmember.UniqueName) приведет к одному и тому же значению. Тем не менее для достижения ядром ожидаемой повышенной производительности этого недостаточно.

Ссылки на динамические элементы

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

(IIF( e, mbr1, mbr2), Sales)

результирующий кортеж невозможно распознать, пока во время выполнения не будет вычислено выражение IIF(). Однако в эквивалентном выражении

IIF( e, (mbr1, Sales), (mbr1, Sales))

оба результирующих кортежа известны до вычисления выражения e.

Подсказки плана

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

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

Подсказки плана в функциях IIF()

В функции IIF(,,) подсказки выражений указываются с помощью следующего синтаксиса:

IIF(<cond>, <expr>, <expr>) [HINT <hints>]

<expr> ::= <expr> [HINT <hints>]

<hints> ::= <hint> [<hints>]

<hint> ::= EAGER | STRICT | LAZY

  • EAGER позволяет вычислять выражение по всему подпространству IIF.

  • STRICT позволяет вычислять выражение только в результирующем подпространстве в соответствии с результатами условного выражения.

  • LAZY позволяет вычислять выражение в режиме «ячейка за ячейкой».

  • Подсказки EAGER и STRICT являются взаимоисключающими: их можно использовать в одной функции IIF(,,) только в разных выражениях.

Пример синтаксиса:

IIF([Measures].[Internet Sales Amount]=0

, {([Date].[Calendar Year].CURRENTMEMBER, [Customer].[Country].[All Customers])} HINT EAGER

, {{[Date].[Calendar Year].CURRENTMEMBER} * [Customer].[Country].[Country].MEMBERS} STRICT LAZY

)

Подсказки плана в свойствах конфигурации

Следующие свойства конфигурации представлены для поддержки подсказок плана в пути OLAP\Query.

Свойство

Допустимые значения

Пояснение

IIFThenMode

0 | 1 | 2

0 = нет подсказки (по умолчанию)

1 = EAGER

2 = STRICT

IIFElseMode

0 | 1 | 2

0 = нет подсказки (по умолчанию)

1 = EAGER

2 = STRICT

LazyEnabled

0 | 1

0 = отключено (по умолчанию)

1 = включено

Определяемые пользователем хранимые процедуры (COM или .NET)

Использование определяемых пользователем хранимых процедур в коде многомерных выражений препятствует повышению производительности.

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

Службы SQL Server 2008 Analysis Services (SSAS) предоставляют хранимые процедуры, оптимизированные для повышения производительности.

Использование именованных наборов или псевдонимов наборов в параметрах

Если в качестве первого параметра в функциях Sum, Min, Max, Avg или Aggregate в коде многомерных выражений используется именованный набор или псевдоним набора, улучшения производительности не будет.

Например, в следующем многомерном выражении подсчитываются элементы, имеющие более одного потомка.

Sum(h.members as S, Iif(S.Current.Children.Count > 1, 1, 0))

Поскольку для выражения h.members используется псевдоним S и из набора с псевдонимом позднее извлекается значение текущей функции, это препятствует повышению производительности.

Другой распространенный пример такой ситуации продемонстрирован в следующем фрагменте кода.

WITH

SET [Core Products] AS '{[Product].[Category].[Bikes]}'

MEMBER [Measures].[Core Products Sales] AS SUM([Core Products], [Measures].[Internet Average Unit Price] * [Measures].[Internet Order Quantity])

Select [Measures].[Core Products Sales] on 0

From [Adventure Works]

На выполнении функции SUM в определении элементов ожидаемое улучшение производительности не отразится, поскольку она основана на именованном наборе.

Использование поздних привязок в выражениях пользовательской свертки

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

Использование упреждающих ссылок в сценариях

Улучшенная производительность не достигается, если в коде многомерных выражений в отдельных инструкциях создаются упреждающие ссылки на определения. Например, в следующем фрагменте сценария многомерных выражений во время определения X создается упреждающая ссылка на Y.

Create Member X as Y * 2;

Create Member Y as ( Sales, [Date].[Calendar].[Month].PreviousMember);

Чтобы исправить эту ситуацию, определение Y должно предшествовать определению X, как показано в следующем фрагменте.

Create Member Y as ( Sales, [Date].[Calendar].[Month].PreviousMember);

Create Member X as Y * 2;

Функции с улучшенной производительностью

Скалярные функции

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

-

OR

KEY

*

XOR

LEVELS.COUNT

/

CALCULATIONPASSVALUE

MEMBERTOSTR

+

CASE

MEMBERVALUE

<

COALESCEEMPTY

NAME

<=

HIERARCHIES.COUNT

ORDINAL

<>

ID

PROPERTIES

=

IIF

UNIQUENAME

>

IS

USERNAME

>=

ISANCESTOR

VALIDMEASURE

unary minus

ISEMPTY

VALUE

NOT

ISLEAF

AND

ISSIBLING

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

При обработке пользовательских хранимых процедур в COM или управляемом коде никакого усовершенствования производительности по сравнению со службами SQL Server 2005 Analysis Services (SSAS) наблюдаться не будет. Дополнительные сведения см. в разделе «Определяемые пользователем хранимые процедуры (COM или .NET)» выше в данном документе. Улучшенная производительность отражается на константных, символьных или численных выражениях.

Функции элементов

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

.CurrentMember

.FirstSibling

.LastSibling

.DataMember

.Item

.Lead

.DefaultMember

.Lag

.Parent

.FirstChild

.LastChild

.UnknownMember

Ancestor

KPIStatus

NextMember

Ancestors

KPITrend

OpeningPeriod

Ascendants

KPIValue

ParallelPeriod

ClosingPeriod

KPIWeight

PrevMember

Cousin

LastPeriods

StrToMember(<String Expression>, CONSTRAINED)

KPIGoal

LinkMember

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

Функция StrToMember(<String Expression>, CONSTRAINED) достигает наилучшей производительности, если <String Expression> является статическим выражением.

Функции наборов

Следующий список функций наборов содержит функции, при выполнении которых следует ожидать улучшенной производительности.

Aggregate

Max

Sum

Avg

Min

Однако при использовании любой из перечисленных функций первым параметром должно быть выражение, содержащее любое сочетание следующих функций.

- (оператор разности множеств)

.Children

MTD

(<set expression>,(<set expression>, …,(<set expression>) (оператор перекрестного соединения)

.Members

PeriodsToDate

* (оператор перекрестного соединения)

.Siblings

QTD

: (оператор диапазона)

AddCalculatedMembers

StrToSet(<String Expression>, CONSTRAINED)

+ (оператор объединения)

Crossjoin(<set expression>,(<set expression>, …,(<set expression>)

Tail

Descendants

Union

Distinct

Unorder

Except

WTD

Hierarchize

YTD

Intersect

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

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

Функции языка VBA

Следующий список функций языка VBA содержит функции, при выполнении которых следует ожидать улучшенной производительности.

Абсолютные кривые

CLng

Len

CDate

CStr

Сейчас

CDbl

Int

Справа

CInt

Слева

Цикл

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

Asc

Формат

Sgn

AscW

FV

Sin

Atn

Hex

SLN

CBool

Час

Место на диске

CByte

IPmt

Sqr

CCur

Lcase

Str

Cdec

Log

StrComp

Chr

Ltrim

StrConv

ChrW

Минута

String

Cos

Month

SYD

CSng

Nper

Tan

Cvar

Октябрь

Timer

Дата

Секция

TimeSerial

DateAdd

Pmt

TimeValue

DateDiff

PPmt

Trim

DatePart

PV

TypeName

DateSerial

QBColor

Ucase

DateValue

Rate

Val

Day

RBG

Weekday

DDB

Rnd

Year

Exp

Rtrim

Fix

Секунда