Esta semana apareció un error interesante en el grupo de noticias relacionado con la función PREVMEMBER. Puedes leer el hilo original aquíque incluye la explicación de Mosha de la naturaleza exacta del problema (todo el crédito para él por tomarse el tiempo para investigar este problema y remitirlo a ng para compartir los detalles; merece una medalla por su participación en la comunidad).

Me pregunto cuántos cubos tienen miembros calculados que sufren de bajo rendimiento debido a esto. No muchos, supongo. El único escenario en el que podría pensar cuando este error podría ser un problema sería si tuviera un cálculo de crecimiento del período anterior, una dimensión de tiempo razonablemente grande (probablemente bajando al nivel de día u hora y que consta de varios años) y un consulta con muchas tuplas en filas o columnas. Pero si cree que tiene este problema, ¿cómo lo soluciona? Bueno, sabiendo que PREVMEMBER es el problema, reescribí la consulta en el hilo para evitarlo y usé una combinación de RANK y ITEM en su lugar:

con
medidas de los miembros.myrank as ‘rank([Customers].[Name].[Amy Petranoff], [Customers].[Name].[Amy Petranoff].PADRES.HIJOS)-2’
miembro [Customers].[CM] me gusta ‘[Customers].[Name].[Amy Petranoff].PADRE.HIJOS.ARTÍCULO(MEDIDAS.MIRANGO)’
ESCOGER { [Customers].[CM] } EN COLUMNAS ,
NO VACÍO { { [Store].[Store Name].Miembros } * {
[Product].[Product Name].Miembros } } EN LÍNEAS
A PARTIR DE [Sales]
o ([Measures].[Unit Sales])

Funciona mucho mejor que la versión PREVMEMBER (solo 4 segundos en lugar de 75), aunque no se ve muy elegante. Pero, ¿qué pasa con un escenario más realista? Volviendo al ejemplo de crecimiento del período anterior, considere la siguiente consulta en Foodmart:

CON MEDIDAS DE MIEMBRO.[PREVMONTH SALES] COMO ‘MEDIDAS.[UNIT SALES] – (LAS MEDIDAS.[UNIT SALES]TIEMPO.MIEMBRO ACTUAL.MIEMBRO ANTERIOR)’
SELECCIONE { MEDIDAS.[UNIT SALES]LAS MEDIDAS.[PREVMONTH SALES] } EN COLUMNAS ,
NO VACÍO
CRUCE(
CRUCE([Store].[Store Name].Miembros ,[Product].[Product Name].Miembros)
,{[Time].[1997].[Q1].NIÑOS,[Time].[1997].[Q2].NIÑOS })
EN FILAS
A PARTIR DE [Sales]

Esto me parece una consulta muy común: encuentre las ventas del mes actual y el crecimiento del mes anterior. Así que reescribí la consulta para usar RANK y ITEM en lugar de PREVMEMBER, por lo que se ve así:

CON
MEDIDAS DE MIEMBRO. PREVTIME AS ‘(MEDIDAS.[UNIT SALES]MIEMBRO ACTUAL.HORA.PADRE.HIJOS.ARTÍCULO(RANGO(MIEMBRO.ACTUAL.HORA, MIEMBRO ACTUAL.HORA.HERMANOS)-2))’
MEDIDAS DE LOS MIEMBROS.[PREVMONTH SALES] COMO ‘MEDIDAS.[UNIT SALES] – MEDIDAS.TIEMPO ANTERIOR’
SELECCIONE { MEDIDAS.[UNIT SALES]LAS MEDIDAS.[PREVMONTH SALES] } EN COLUMNAS ,
NO VACÍO
CRUCE(
CRUCE([Store].[Store Name].Miembros ,[Product].[Product Name].Miembros)
,{[Time].[1997].[Q1].NIÑOS,[Time].[1997].[Q2].NIÑOS })
EN FILAS
A PARTIR DE [Sales]

Al ejecutar estas dos consultas en mi computadora portátil, desde un caché frío, la primera se ejecuta en 73 segundos y la segunda se ejecuta en 65 segundos. Por lo tanto, no es una gran diferencia, pero podría ser más significativa en una dimensión de tiempo más grande o en una consulta mucho más grande. No creo que cambie la forma en que escribo mis cálculos MDX estándar como resultado…