Eu tenho uma consulta MDX que foi escrita por um novato MDX que é excessivamente lento (a consulta, ou seja, não o novato MDX). E também sou um novato em MDX. Aqui está a consulta:
SELECT
NON EMPTY
(
[Measures].[Status]
)
ON COLUMNS,
NON EMPTY
(
Filter
(
Crossjoin
(
{
[Value1].[Value1].[Value1A],
[Value1].[Value1].[Value1B]
},
[Value2].[Value2A].[Value2A],
[Value3].[Value3].[Value3].ALLMEMBERS,
[Value4].[Value4].[Value4].ALLMEMBERS,
[Value5].[Value5].[Value5],
[Value2].[Value2B].[Value2C],
[Value6].[Value6].[Value6],
[Value7].[Value7A].[Value7A]
),
(
[Measures].[Status]
) > 0
)
)
ON ROWS
FROM [Cube]
WHERE
(
[Value7].[Value7].[Value7A],
[Value8].[Value8].[Value8A],
[Value9].[Value9].[Value9A]
)
CELL PROPERTIES VALUE
Tenho muito pouco conhecimento de MDX, mas por meio de tentativa e erro, descobri que remover as duas [Value1].[Value1]
entradas do Crossjoin
faz com que a consulta retorne rapidamente. Ou remover as entradas [Value2].[Value2A]
e [Value5]
também faz com que ele retorne rapidamente. Mas, obviamente, isso está mudando a consulta, então não é a solução, mas talvez forneça pistas de onde devo procurar em termos de índices ou algo parecido se houver algo assim no SQL Analysis Services (estou mais familiarizado com bancos de dados SQL Server)?
Uma coisa que tentei é colocar &
antes [Value1A]
e [Value1B]
. Isso fazia com que a consulta retornasse muito rapidamente sem resultados. Infelizmente não sei se está correto pois a consulta sem esta alteração demora muito para poder ver se há algum resultado. Não sei que diferença &
deve fazer, mas essa é a resposta óbvia ou muda a consulta para ser diferente? É igualmente possível que o criador original desta consulta tenha usado &
de qualquer maneira, mas nunca tenha testado a consulta com um conjunto de dados real.
Qualquer ajuda seria muito apreciada.
Encontrei uma resposta aqui que ajudou minha situação e agora a consulta retorna muito rapidamente. Parece que a
HAVING
cláusula é uma solução melhor do que usar aFilter
função, desde que o conjunto de dados seja razoavelmente pequeno. Porém, notei que retirarNON EMPTY
do segundo eixo (ON ROWS
) faz com que ele ainda fique lento mesmo usando aHAVING
cláusula. Talvez eu ainda precise resolver esse problema também. Mas, pelo menos o primeiro problema está resolvido.Tente isto: