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