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.
Importante |
---|
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 |
|