Condividi tramite


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 necessario per elaborare completamente tutte le celle di un cubo è noto come livello di nidificazione della sessione di calcolo del cubo.

I dati writeback e delle tabelle dei fatti influiscono solo sulla sessione 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 creata dallo script per il cubo.

In tutte le sessioni vengono creati membri calcolati, ma l'espressione viene applicata alla 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 MicrosoftSQL ServerAnalysis Services per dimensioni, membri, membri calcolati, rollup personalizzati e celle calcolate.

  • L'ordine utilizzato da Analysis Services per calcolare 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 di aggregazione. Per i membri calcolati con la funzione di aggregazione viene applicato un ordine di valutazione inferiore rispetto a qualsiasi misura calcolata intersecante.

Precedenza per i calcoli

La precedenza per i calcoli definisce l'ordine con cui si ottengono i valori per un'espressione definita nella cella corrente. La risoluzione della precedenza per i calcoli avviene in base all'algoritmo seguente:

  1. Viene creato un elenco di calcolo (CL, Calculation List) per tutti i calcoli al livello di granularità della cella corrente o inferiore.

  2. I calcoli dell'elenco di calcolo vengono classificati in HW (Highest Wins, prevale il superiore) o CW (Closest Wins, prevale il più vicino).

    1. La categoria CW si applica a rollup personalizzati, operatori unari, misure semiadditive e blocco.

    2. La categoria HW si applica a tutti gli altri calcoli.

  3. Viene creato un elenco di calcolo ordinato (OCL, Ordered Calculation List) con tutti i calcoli della categoria HW ordinati in base alla sessione.

  4. Per ognuno dei calcoli rimanenti della categoria CW:

    1. Per ogni calcolo (C) dell'elenco di calcolo ordinato (dal superiore all'inferiore).

    2. Se CW è più vicino alla cella corrente rispetto a C, CW viene inserito nell'elenco OCL e si passa al successivo CW.

    3. Se CW si trova in una sessione superiore rispetto a C, CW viene inserito nell'elenco OCL e si passa al successivo CW.

    4. Si passa quindi al calcolo successivo.

  5. Se il calcolo al livello superiore nell'elenco OCL non si trova allo stesso livello di granularità della cella corrente, viene calcolato il valore di aggregazione utilizzando le funzioni di aggregazione.

Valori dell'ordine di valutazione e precedenza

I valori dell'ordine di valutazione sono compresi tra -8181 e 65535. In questo intervallo, alcuni valori corrispondono a tipi specifici di calcoli, come illustrato nella tabella seguente.

Calcolo

Ordine di valutazione

Formule personalizzate membro

-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. Se, ad esempio, al calcolo per un membro calcolato viene assegnato un valore dell'ordine di valutazione inferiore al valore predefinito delle formule personalizzate di rollup, che corrisponde a -5119, tale valore comporta l'esecuzione del calcolo dei membri calcolati prima delle formule personalizzate di rollup e può produrre risultati non corretti.

Creazione 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 creare 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, che richiede l'applicazione dell'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 nel cubo non vengano utilizzati 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 di reddito al netto delle spese

Nella seconda query si desidera determinare la percentuale di 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 sono dovute alla 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 diventa importante nella query successiva, in cui i due membri calcolati vengono combinati in una singola query MDX.

Query 3 - Calcolo combinato della differenza annuale e del reddito netto

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 la sequenza di esecuzione 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 iniziare da zero o essere consecutivi. Il valore indica semplicemente al sistema 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 nella query MDX seguente i calcoli utilizzati nelle prime due query:

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. In Analysis Services la cella in questione viene valutata utilizzando la formula per 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 in Analysis Services viene calcolato 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

Il risultato nella cella condivisa viene tuttavia calcolato diversamente in Analysis Services 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, in Analysis Services viene utilizzata la formula per 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é nella query viene utilizzata la formula per 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 in Analysis Services viene valutata una query MDX, Analysis Services prende in considerazione i valori dell'ordine di valutazione per tutti gli elementi coinvolti in una determinata sessione, incluse le dimensioni del cubo specificate nella query MDX.