Mejoras en el rendimiento de MDX en SQL Server 2008 Analysis Services

En esta versión de Analysis Services, se ha hecho especial hincapié en mejorar el rendimiento en la ejecución de cálculos de expresiones multidimensionales (MDX). Se han realizado varios cambios importantes en la arquitectura del motor para lograr este tipo de mejoras en el rendimiento. Sin embargo, para sacar provecho de estas mejoras en el rendimiento es necesario optimizar el código MDX.

Este documento le ayudará a entender en que lugar del código MDX existente se pueden producir problemas que evitan experimentar mejoras en el rendimiento. Asimismo, le proporcionará consejos sobre cómo evitar ese tipo de problemas en la nueva codificación MDX. Este documento incluye además una lista de las funciones que sacan provecho de las mejoras en el rendimiento.

Revisión del código para aumentar al máximo el rendimiento en MDX

Cuando revise el código, intente evitar el siguiente conjunto de escenarios o de situaciones de codificaciones, ya que pueden impedir que las instrucciones MDX obtener las mejoras esperadas en el rendimiento que se han implementado en SQL Server 2008 Analysis Services (SSAS) en primer lugar. Sin embargo, cuando no sea posible cambiar el código para evitar las situaciones enumeradas, es probable que el código MDX presente el mismo nivel de rendimiento que el que tenía en SQL Server 2005 Analysis Services (SSAS).

Definiciones útiles

Espacio

El conjunto de celdas sobre las que se evalúa una expresión.

Forma arbitraria

Un espacio que no se puede expresar como la combinación cruzada de dos o más conjuntos. Por ejemplo, el espacio {(Drink, USA), (Food, Canada)} representa una forma arbitraria porque es un subconjunto de la combinación cruzada entre {Drink, Food} * {USA, Canada} = {(Drink, USA), (Drink, Canada), (Food, USA), (Food, Canada)}.

Expresión estática

Se considera que una expresión es estática cuando permanece invariable en el espacio en el que se calcula.

Por ejemplo, en el espacio de CrossJoin(Product.Members, Customer.Members), las expresiones siguientes son invariables.

  • 1, una expresión constante

  • Product.Members.Count

Expresión dinámica

Se dice que una expresión es dinámica cuando obtiene un valor diferente para cada celda en el espacio en el que se calcula.

Por ejemplo, en el espacio de CrossJoin(Product.Members, Customer.Members), las expresiones siguientes son dinámicas.

  • Sales, porque Sales es una medida que tiene un valor diferente para cada celda en el espacio.

Atributo variable

Un atributo variable controla cómo se evalúa la expresión y hace que ésta dependa del atributo. Por ejemplo, la expresión Customer.Geography.CurrentMember depende de los atributos en la jerarquía geográfica.

Los atributos variables reducen normalmente el espacio en el que se evalúan las expresiones. Observe la expresión siguiente:

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

En esta expresión, Customers.Geography es una expresión estática. La función currentmember es un atributo variable debido a que introduce una dependencia en el atributo City. Uniquename no agrega ningún atributo variable porque se enlaza a currentmember en una relación de 1:1. Por lo tanto, uniquename se evaluará una sola vez para cada cliente y no se repetirá para cada valor de Product. Por consiguiente, se ha reducido eficazmente el espacio de expresión entero en el atributo variable.

Usar expresiones en las propiedades sin valor de una celda

Ninguna de las expresiones MDX utilizadas para asignar el valor de una propiedad sin valor de una celda aprovecharán las ventajas de las mejoras de rendimiento. El rendimiento se mantendrá en el mismo nivel que en SQL Server 2005 Analysis Services (SSAS).

Usar funciones no enumeradas

El uso de funciones no enumeradas en este documento en el código MDX no aprovechará las ventajas de la mejora del rendimiento esperado para esta versión del producto. Vea Functions with enhanced performance en este documento.

Usar la seguridad de celda

La evaluación de una expresión MDX en un espacio con seguridad de celda definida impedirá que el código obtenga mejoras de rendimiento.

En la tabla siguiente se muestra la relación entre la seguridad de celda y el rendimiento.

Seguridad de Celda

Rendimiento esperado

Ninguna

Máximo

Lectura

Medio

Contingente de lectura

Mínimo

Vea Utilizar expresiones MDX para establecer permisos en los datos de las celdas y Conceder acceso personalizado a los datos de las celdas.

Usar la dimensionalidad dinámica

El uso de expresiones de dimensionalidad dinámica en el código MDX impide que este último aproveche las ventajas de mejoras de rendimiento. Por ejemplo, expresiones como Sum( IIF( Sales > 10000, h1.Members, h2.Members)) no se beneficiarán debido a que el código está modificando los miembros que van a sumarse al mismo tiempo que se evalúa la expresión Sales. Otro ejemplo podría ser un escenario en la que sea necesario usar un miembro del año natural o un miembro de las jerarquías del año fiscal dependientes de un atributo perteneciente al miembro actual del atributo de cuenta a fin de realizar una comparación con el valor equivalente de un período paralelo. La expresión MDX necesaria para este escenario se asemejaría bastante al código de ejemplo siguiente.

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

De nuevo, las dimensiones cambian de forma dinámica a medida que cambia el miembro actual de la dimensión de cuenta.

Usar parámetros dinámicos

El uso de parámetros dinámicos en el código MDX impide que el código obtenga mejoras de rendimiento. Por ejemplo, una expresión como KpiGoal("Sales_" & [Fiscal Year].currentmember.UniqueName) varía en las celdas en las que se ha calculado. En cambio, la expresión KpiGoal("Sales_" & Cstr(Year(Now))) es invariable.

Nota importanteImportante

Es posible que la expresión KpiGoal("Sales_" & [Fiscal Year].currentmember.UniqueName) se evalúe con el mismo valor en el espacio en el que se ha calculado. Sin embargo, eso no sería suficiente para que el motor proporcione las mejoras de rendimiento esperado.

Referencias de miembros dinámicas

El uso de cualquier referencia de miembros dinámica en el código MDX impide que este último obtenga mejoras de rendimiento. Por ejemplo, en la siguiente expresión

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

no hay ninguna manera de conocer la tupla resultante hasta que la expresión IIF() se evalúe en el tiempo de ejecución. Sin embargo, en la expresión equivalente siguiente

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

las dos tuplas resultantes se conocen antes de evaluar la expresión e.

Procedimientos almacenados definidos por el usuario (COM o .NET)

El uso de procedimientos almacenados definidos por el usuario en el código MDX impedirá que el código se aproveche de las ventajas de rendimiento mejorado.

Nota

Analysis Services proporciona procedimientos almacenados que se optimizan para las mejoras de rendimiento.

Usar conjuntos con nombre o alias de conjunto como parámetros

Cada vez que se usa un conjunto con nombre o un alias de conjunto como el primer parámetro en las funciones Sum, Min, Max, Avgo Aggregate en el código MDX, éste no aprovecha las ventajas de las mejoras de rendimiento.

Por ejemplo, la expresión MDX siguiente cuenta cuántos miembros tienen más de un elemento secundario.

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

Dado que h.members se ha asociado como S y el valor de función Current posterior se obtiene del conjunto asociado, éste impide obtener las mejoras esperadas de rendimiento.

En el código siguiente se muestra otro ejemplo común para este tipo de situaciones.

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]

La función SUM en la definición de miembros no obtiene la mejora del rendimiento esperado porque se basa en un conjunto con nombre.

Usar enlaces en tiempo de ejecución en expresiones de resumen personalizado

Cada vez que una expresión de resumen personalizado hace referencia a un miembro calculado o a otra expresión MDX que se evalúa en el tiempo de ejecución, la expresión de resumen personalizado impide el rendimiento mejorado.

Usar referencias adelantadas en scripts

Cada vez que cree referencias adelantadas en definiciones, en instrucciones independientes, en el código MDX, el código no aprovechará las ventajas de mejoras de rendimiento. Por ejemplo, en el fragmento de script MDX siguiente se ha creado una referencia adelantada en Y durante la definición de X.

Create Member X as Y * 2;

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

Para corregir esta situación, sitúe la definición de Y delante de la de X, como se muestra en el fragmento siguiente.

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

Create Member X as Y * 2;

Funciones con rendimiento mejorado

Funciones escalares

La siguiente lista de funciones escalares incluye las funciones en las que se debería esperar obtener el rendimiento mejorado. La primera columna de la lista contiene los operadores escalares.

-

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

 

Nota

Ninguno de los procedimientos almacenados definidos por el usuario, ya sea con código COM o administrado, podrá obtener mejoras de rendimiento cuando se compare con SQL Server 2005 Analysis Services (SSAS). Para obtener más información, vea más arriba en este documento los procedimientos almacenados definidos por el usuario (COM o .NET). Las expresiones constantes, literales o numéricas, aprovecharán las ventajas de las mejoras de rendimiento.

Funciones de miembro

La siguiente lista de funciones de miembro incluye las funciones en las que se espera que se muestre el rendimiento mejorado.

.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

 

Nota

StrToMember(<String Expression>, CONSTRAINED) obtiene el máximo rendimiento posible cuando <String Expression> es una expresión estática.

Funciones set

La lista siguiente de funciones set incluye las funciones en las que se espera que se muestre el rendimiento mejorado.

Aggregate

Max

Sum

Avg

Min

 

Sin embargo, cuando se usan funciones enumeradas, el primer parámetro debe ser una expresión que utilice cualquier combinación de las funciones siguientes.

- (operador excepto)

.Children

MTD

(<set expression>,(<set expression>, …,(<set expression>) (operador de combinaciones cruzadas)

.Members

PeriodsToDate

* (operador de combinaciones cruzadas)

.Siblings

QTD

: (operador de intervalo)

AddCalculatedMembers

StrToSet(<String Expression>, CONSTRAINED)

+ (operador de unión)

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

Tail

 

Descendants

Union

 

Distinct

Unorder

 

Except

WTD

 

Hierarchize

YTD

 

Intersect

 

Nota

Los conjuntos estáticos, incluido el conjunto vacío, también aprovecharán las ventajas de mejoras del rendimiento esperado.

Funciones VBA

La siguiente lista de funciones VBA incluye las funciones en las que se espera que se muestre el rendimiento mejorado.

Abs

CLng

Len

CDate

CStr

Now

CDbl

Int

Right

CInt

Left

Round

En las siguientes funciones VBA se puede esperar un rendimiento mejorado cuando la función se evalúa sobre atributos variables.

Asc

Format

Sgn

AscW

FV

Sin

Atn

Hex

SLN

Cbool

Hour

Space

Cbyte

Ipmt

Sqr

Ccur

Lcase

Str

Cdec

Log

StrComp

Chr

Ltrim

StrConv

ChrW

Minute

String

Cos

Month

SYD

CSng

Nper

Tan

Cvar

Oct

Timer

Date

Partition

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

Second