Informazioni sull'ordine di calcolo e di valutazione (MDX)
L'operazione di calcolo di un cubo, risultante da uno script MDX, può essere suddivisa in numerose fasi di calcolo a seconda dell'utilizzo delle varie funzionalità correlate ai calcoli. Ognuna di queste fasi viene indicata come sessione di calcolo.
Per fare riferimento a una sessione di calcolo è possibile specificare una posizione ordinale, denominata numero della sessione di calcolo. Il numero di sessioni di calcolo necessarie per elaborare completamente tutte le celle di un cubo è noto come livello di nidificazione della sessione di calcolo del cubo.
I dati delle tabelle dei fatti e di writeback influiscono solo sulla sessione di calcolo 0. Gli script popolano i dati dopo la sessione 0. Per ogni istruzione di assegnazione e calcolo in uno script viene creata una nuova sessione di calcolo. Esternamente allo script MDX, i riferimenti alla sessione assoluta 0 si riferiscono all'ultima sessione di calcolo creata dallo script per il cubo.
In tutte le sessioni vengono creati membri calcolati, ma l'espressione viene applicata nella sessione corrente. Le sessioni precedenti contengono la misura calcolata, ma con un valore Null.
Ordine di valutazione
L'ordine di valutazione determina la priorità di calcolo in presenza di espressioni in conflitto. Nell'ambito di una singola sessione, l'ordine di valutazione determina quanto segue:
L'ordine di valutazione applicato da Microsoft SQL Server Analysis Services per dimensioni, membri, membri calcolati, rollup personalizzati e celle calcolate.
L'ordine di calcolo applicato da Analysis Services per membri personalizzati, membri calcolati, rollup personalizzati e celle calcolate.
Viene data la precedenza al membro con l'ordine di valutazione più alto.
Nota
L'unica eccezione è rappresentata dalla funzione Aggregate. Per i membri calcolati con la funzione Aggregate viene applicato un ordine di valutazione inferiore rispetto a qualsiasi misura calcolata intersecante.
Valori dell'ordine di valutazione e precedenze
I valori validi per l'ordine di valutazione sono compresi nell'intervallo da -8181 a 65535. In questo intervallo, alcuni valori corrispondono a tipi specifici di calcoli, come illustrato nella tabella seguente.
Calcolo |
Ordine di valutazione |
---|---|
Formule personalizzate per singoli membri |
-5119 |
Operatori unari |
-5119 |
Calcolo di totali visualizzati |
-4096 |
Tutti gli altri calcoli (se non diversamente specificato) |
0 |
È consigliabile utilizzare esclusivamente numeri interi positivi per l'impostazione dei valori dell'ordine di valutazione. Se si assegnano valori inferiori a quelli indicati nella tabella precedente, il risultato della sessione di calcolo può diventare imprevedibile. Si supponga, ad esempio, che la sessione di calcolo per un membro calcolato riceva un valore dell'ordine di valutazione minore del valore predefinito per le formule personalizzate di rollup, ovvero -5119. Con l'impostazione di un valore così basso per l'ordine di valutazione, il calcolo dei membri calcolati viene eseguito prima di quello delle formule personalizzate di rollup e ciò può portare a risultati errati.
Impostazione e modifica dell'ordine di valutazione
Nel riquadro Calcoli di Progettazione cubi è possibile modificare l'ordine di valutazione per i membri calcolati e le celle calcolate modificando l'ordine dei calcoli.
In MDX, è possibile utilizzare la parola chiave SOLVE_ORDER per impostare o modificare l'ordine di valutazione per membri calcolati e celle calcolate.
Esempi di ordine di valutazione
Per illustrare le potenziali complessità correlate all'ordine di valutazione, la serie seguente di query MDX inizia con due query che singolarmente non presentano problemi a livello di ordine di valutazione. Queste due query vengono quindi combinate in una singola query, in cui diventa necessario impostare l'ordine di valutazione.
Query 1: differenze tra reddito e spese
Per la prima query MDX, finalizzata a individuare la differenza tra reddito e spese per ogni semestre dell'anno, viene creata una semplice query MDX simile all'esempio seguente:
WITH
MEMBER [Time].[Year Difference] AS
[Time].[2nd half] - [Time].[1st half]
SELECT
{ [Account].[Income], [Account].[Expenses] } ON COLUMNS,
{ [Time].[1st half], [Time].[2nd half], [Time].[Year Difference] } ON ROWS
FROM Financials
In questa query è presente un solo membro calcolato, ovvero Year Difference. Essendo presente un solo membro calcolato, l'ordine di valutazione è irrilevante a condizione che il cubo non utilizzi altri membri calcolati.
Questa query MDX genera un set di risultati simile a quello illustrato nella tabella seguente.
Income |
Expenses |
|
---|---|---|
1st half |
5000 |
4200 |
2nd half |
8000 |
7000 |
Year Difference |
3000 |
2800 |
Query 2: percentuale del reddito al netto delle spese
Nella seconda query si desidera determinare la percentuale del reddito al netto delle spese per ogni semestre dell'anno utilizzando la query MDX seguente:
WITH
MEMBER [Account].[Net Income] AS
([Account].[Income], [Account].[Expenses]) / [Account].[Income]
SELECT
{ [Account].[Income], [Account].[Expenses], [Account].[Net Income] } ON COLUMNS,
{ [Time].[1st half], [Time].[2nd half] } ON ROWS
FROM Financials
Questa query MDX, come la precedente, non presenta complicazioni relativamente all'ordine di valutazione, in quanto include anch'essa un solo membro calcolato, ovvero Net Income.
Questa query MDX genera un set di risultati leggermente diverso, simile a quello illustrato nella tabella seguente.
Income |
Expenses |
Net Income |
|
---|---|---|---|
1st half |
5000 |
4200 |
0.16 |
2nd half |
8000 |
7000 |
0.125 |
Le differenze nei set di risultati della prima e della seconda query derivano dalla diversa posizione del membro calcolato. Nella prima query, il membro calcolato fa parte dell'asse ROWS e non dell'asse COLUMNS indicato nella seconda query. Questa differenza di posizione diventerà importante nell'esempio di query successivo, in cui i due membri calcolati verranno combinati in una singola query MDX.
Query 3: utilizzo combinato dei membri calcolati Year Difference e Net Income
Nella query finale che combina entrambi gli esempi precedenti in una singola query MDX, l'ordine di valutazione diventa importante. Per assicurarsi che i calcoli vengano eseguiti nella sequenza corretta, è necessario definire l'ordine di valutazione dei calcoli tramite la parola chiave SOLVE_ORDER.
La parola chiave SOLVE_ORDER consente di specificare l'ordine di valutazione dei membri calcolati in una query MDX o in un comando CREATE MEMBER. I valori integer utilizzati con la parola chiave SOLVE_ORDER sono relativi e non devono necessariamente partire da zero o essere consecutivi. Il valore specificato indica semplicemente al motore MDX di calcolare un membro in base ai valori derivati dal calcolo dei membri con un valore superiore. Se un membro calcolato viene definito senza la parola chiave SOLVE_ORDER, il relativo valore predefinito sarà zero.
Se ad esempio si combinano i calcoli utilizzati nelle prime due query di esempio, i due membri calcolati Year Difference e Net Income si intersecano in corrispondenza di una singola cella nel set di dati risultante dell'esempio di query MDX. L'unico modo per determinare come questa cella verrà valutata da Analysis Services consiste nell'utilizzare l'ordine di valutazione. Le formule utilizzate per creare la cella genereranno risultati diversi a seconda dell'ordine di valutazione dei due membri calcolati.
Provare innanzitutto a combinare i calcoli utilizzati nelle prime due query nella query MDX seguente:
WITH
MEMBER [Time].[Year Difference] AS
'[Time].[2nd half] - [Time].[1st half],
SOLVE_ORDER = 1
MEMBER [Account].[Net Income] AS
'([Account].[Income] - [Account].[Expenses]) / [Account].[Income]',
SOLVE_ORDER = 2
SELECT
{ [Account].[Income], [Account].[Expenses], [Account].[Net Income] } ON COLUMNS,
{ [Time].[1st half], [Time].[2nd half], [Time].[Year Difference] } ON ROWS
FROM Financials
In questo esempio di query MDX combinata, a Net Income è associato l'ordine di valutazione più alto e pertanto viene calcolato per primo quando le due espressioni interagiscono. Analysis Services valuta la cella in questione tramite la formula Net Income. Nella tabella seguente sono riportati i risultati di questo calcolo nidificato.
Income |
Expenses |
Net Income |
|
---|---|---|---|
1st half |
5000 |
4200 |
0.16 |
2nd half |
8000 |
7000 |
0.125 |
Year Difference |
3000 |
2800 |
0.066 |
Il risultato nella cella condivisa è basato sulla formula per Net Income. Ciò significa che Analysis Services calcola il risultato nella cella condivisa con i dati di Year Difference, generando la formula seguente (il risultato è arrotondato per maggiore chiarezza):
((8000 - 5000) - (7000 - 4200)) / (8000 - 5000) = 0.066
oppure
(3000 - 2800) / 3000 = 0.066
Tuttavia, Analysis Services calcola diversamente il risultato nella cella condivisa se si inverte l'ordine di valutazione dei membri calcolati nella query MDX. Nella query MDX combinata seguente viene invertito l'ordine di valutazione dei membri calcolati:
WITH
MEMBER [Time].[Year Difference] AS
'[Time].[2nd half] - [Time].[1st half],
SOLVE_ORDER = 2
MEMBER [Money].[Net Income] AS
'([Money].[Income] - [Money].[Expenses]) / [Money].[Income]',
SOLVE_ORDER = 1
SELECT
{ [Money].[Income], [Money].[Expenses], [Money].[Net Income] } ON COLUMNS,
{ [Time].[1st half], [Time].[2nd half], [Time].[Year Difference] } ON ROWS
FROM TestCube
Poiché l'ordine dei membri calcolati è stato invertito, Analysis Services utilizza la formula di Year Difference per valutare la cella, come illustrato nella tabella seguente.
Income |
Expenses |
Net Income |
|
---|---|---|---|
1st half |
5000 |
4200 |
0.16 |
2nd half |
8000 |
7000 |
0.125 |
Year Difference |
3000 |
2800 |
-0.035 |
Poiché la query utilizza la formula di Year Difference con i dati di Net Income, la formula della cella condivisa esegue un calcolo simile al seguente:
((8000 - 7000) / 8000) - ((5000 - 4200) / 5000) = -0.035
oppure
0.125 - 0.16 = -0.035
Considerazioni aggiuntive
L'ordine di valutazione può essere un aspetto estremamente complesso da affrontare, soprattutto in cubi con un numero elevato di dimensioni che includono membri calcolati, formule personalizzate di rollup o celle calcolate. Quando Analysis Services valuta una query MDX, Analysis Services prende in considerazione i valori dell'ordine di valutazione per tutti gli elementi coinvolti in una data sessione, incluse le dimensioni del cubo specificate nella query MDX.
Vedere anche