Tricks (misure lente)

Il software per la BI di Microsoft, leader nel mercato
Rispondi
Avatar utente

xalbex
Messaggi: 46 | Topic creati
Iscritto il: dom 30 ott 2022, 11:07
Luogo: Parma
Ringraziato: 4 volte

Tricks (misure lente)

Messaggio da xalbex »

Ciao ragazzi.
Torno da voi per un tema che (so benissimo) è molto complicato da risolvere senza avere un file di riferimento.

TEMA: calcoli lenti di misure
SVOLGIMENTO: ho creato delle misure che a me sembrano piuttosto "semplici", ma che hanno da valutare un database con circa 5mln di righe (in cui ci sono solo i consuntivi di 2 anni, ergo man mano che entreranno degli altri consuntivi il database aumenterà ancor di più le dimensioni, ergo la questione può solo che peggiorare)...
Le misure funzionano secondo gli scopi che mi sono prefissato (e ci ho perso un sacco di tempo per testarle)...
Però non è accettabile aspettare dai 3 ai 5 minuti (li ho cronometrati) per fare in modo che i report che utilizzano quelle misure si aggiornino.
Vorrei davvero condividere con voi il dataset, ma dato che contiene dati aziendali sensibili non posso.
Ne tanto meno posso crearne una bozza perché vai a riempire 5mln di righe con dati "inventati"....non saprei nemmeno come fare.

Per questo faccio un tentativo.
Vi posto le misure che danno "più fastidio" quelle più lente sperando nella vostra onniscienza :shifty:

PLAN

Codice: Seleziona tutto

PLAN = CALCULATE(
	SUMX(
		ADDCOLUMNS(
			SUMMARIZE(FBFF, Promo[DataRIF*], Promo[CP], Cliente[Cliente], Prodotto[Codice]),
			"Stima", IF([MEDIA] = BLANK(), CALCULATE(SUM(FBFF[Stima])), [MEDIA])
		),
		[Stima]
	),
	KEEPFILTERS(Tempo[Year] = YEAR(NOW())),
	USERELATIONSHIP(Tempo[Data], FBFF[DataRIF*])
)

Nella misura PLAN utilizzo la misura MEDIA:

Codice: Seleziona tutto

MEDIA = CALCULATE(
	SUMX(
		ADDCOLUMNS(
			SUMMARIZE(FBFF, Promo[CP], Cliente[Cliente], Prodotto[Codice]),
			"Num", [NUMERICA],
			"Ord", CALCULATE(SUM(FBFF[Ordinato]))
		),
		[Ordinato] / [Numerica]
	),
	USERELATIONSHIP(Tempo[Data], FBFF[DataRIF*]),
	Tempo[Year] > YEAR(NOW())-2,
	ALL(Tempo),
	Promo[FSO]< NOW()
)

Nella misura MEDIA utilizzo la misura NUMERICA:

Codice: Seleziona tutto

NUMERICA = COUNTROWS(
	ADDCOLUMNS(
		SUMMARIZE(FBFF, Promo[DataRIF*], Promo[CP], Cliente[Cliente], Prodotto[Codice]),
		"Ord", CALCULATE(SUM(FBFF[Ordinato]))
	)
)

Note:
-Sorry per l'identazione, non proprio da manuale di alcune funzioni tipo SUMMARIZE, ma a mio modo di vedere le cose identare SUMMARIZE usando una riga per ogni parametro distoglie dalla lettura della misura. :crazy:
-FBFF è la tabella dei Fatti.
-Promo, Cliente, Prodotto e Tempo sono le tabelle delle Dimensioni.
-Per il calcolo di MEDIA non ho utilizzato AVERAGEX perché il dataset che c'è sotto ha righe non aggregate sul livello di dettaglio che serve a me per il calcolo della media.
-USERELATIONSHIP è utilizzata nelle misure perché la Tabella Tempo è collegata alla Tabella FBFF con una doppia relazione (una attiva e l'altra no).
Quella non attiva è, appunto, Tempo[Data] -> FBFF[DataRIF*].
-La colona [DataRIF*] è "nativa" della tabella Promo (viene calcolata come colonna aggiuntiva che restituisce il mese della promo), ma poi portata anche nella tabella FBFF sulla quale è collegata la Tabella Tempo. Collegare Tempo con Promo non è possibile perché Promo è collegata a FBFF...mi da (ovviamente) errore.

Grazie mille per il tempo che mi dedicherete.


Avatar utente

Andrea90
Messaggi: 2360 | Topic creati
Iscritto il: dom 28 giu 2020, 19:41
Luogo: Bologna
Ringraziato: 687 volte
Contatta:

Tricks (misure lente)

Messaggio da Andrea90 »

xalbex,

Praticamente impossibile risponderti, le questioni riguardanti le performance vanno analizzate con un file reale (comprensivo di modello).

Al limite puoi utilizzare il Performance Analyzer di Power BI, lanciare il refresh della pagina tramite esso, e poi esportare il file Json (non conterrà i dati sensibili, ma solo i dati che vedi nel Performance Analyzer). Allega poi quel file Json così da vedere le stesse cose che vedi tu.

Detto questo non credo che ciò aiuterà più di tanto nel capire il problema.

Una cosa che chiederei di fare poi è di modificare la formula [PLAN] come segue (prova a vedere se non ti da errori di sintassi):

Codice: Seleziona tutto

PLAN = CALCULATE(
	SUMX(
		ADDCOLUMNS(
			SUMMARIZE(FBFF, Promo[DataRIF*], Promo[CP], Cliente[Cliente], Prodotto[Codice]),
			"Stima", CALCULATE(SUM(FBFF[Stima]))
		),
		[Stima]
	),
	KEEPFILTERS(Tempo[Year] = YEAR(NOW())),
	USERELATIONSHIP(Tempo[Data], FBFF[DataRIF*])
)
Praticamente ho tolto la parte della IF (so che ti serve, ma voglio prima vedere quanto migliora il refresh). Perché come prima cosa direi che c'è un insieme di formule che iterano tabelle innestate fra di loro.

Considera che SUMX, ADDCOLUMNS, sono due iteratori, e la misura plan già li contiene (iterando il group by dato da summarize), ma a sua volta anche il calcolo della media lo contiene, idem poi per la terza misura "numerica".

Un'altra prova che farei è utilizzare questa misura per PLANT:

Codice: Seleziona tutto

PLAN =
CALCULATE (
    SUMX (
        ADDCOLUMNS (
            SUMMARIZE (
                FBFF,
                Promo[DataRIF*],
                Promo[CP],
                Cliente[Cliente],
                Prodotto[Codice]
            ),
            "Stima",
                VAR CurMedia = [MEDIA]
                RETURN
                    IF ( ISBLANK ( CurMedia ), CALCULATE ( SUM ( FBFF[Stima] ) ), CurMedia )
        ),
        [Stima]
    ),
    KEEPFILTERS ( Tempo[Year] = YEAR ( NOW () ) ),
    USERELATIONSHIP ( Tempo[Data], FBFF[DataRIF*] )
)
Andrea
Se hai gradito l'aiuto che hai ricevuto considera di contribuire alle spese per il mantenimento del forum facendo una libera DONAZIONE --> Link

Ricordarsi di segnare come "RISOLTE" le discussioni per le quali si è ricevuto un feedback positivo. Per vedere come fare --> Link
Avatar utente

Autore del topic
xalbex
Messaggi: 46 | Topic creati
Iscritto il: dom 30 ott 2022, 11:07
Luogo: Parma
Ringraziato: 4 volte

Tricks (misure lente)

Messaggio da xalbex »

Grazie Andrea90 per il tuo tempo.
Proverò con Performance Analyzer che anche se non risolverà il problema, quantomeno mi farà capire di più.

Stavo pensando…dato che la tabella che utilizzo per il calcolo delle 3 misure è sempre la stessa, se provassi a creare un’unica misura nella quale inglobare MEDIA e NUMERICA allo scoop di calcolare PLAN?
Secondo troppo cambierebbe qualcosa?
Ovviamente iL calcolo di MEDIA e NUMERICA sarebbero comunque a se stanti perché basati su filtri diversi da PLAN.
Ma almeno la tabella verrebbe valutata solo una volta.
Non sono sicuro però che una volta creata la variabile

Codice: Seleziona tutto

VAR TabellaRif = SUMMARIZE(FBFF, Promo[DataRIF*], Promo[CP], Cliente[Cliente], Prodotto[Codice])
questa possa essere poi sfruttata con ADDCOLUMNS che se non sbaglio non accetta variabili tabella definite nella misura (o mi sbaglio)?
Avatar utente

Enrico Galli
Messaggi: 890 | Topic creati
Iscritto il: dom 28 giu 2020, 19:03
Luogo: San Giovanni in Persiceto (BO)
Ringraziato: 326 volte
Contatta:

Tricks (misure lente)

Messaggio da Enrico Galli »

xalbex ha scritto: ven 17 feb 2023, 22:49 ADDCOLUMNS che se non sbaglio non accetta variabili tabella definite nella misura (o mi sbaglio)?
Ciao. Qui ti sbagli: ADDCOLUMNS (e FILTER, o SUMX ad esempio, comunque credo tutte le funzioni che hanno un row context) lo puoi fare. Non puoi usare una tabella calcolata dinamicamente come primo argomento di un CALCULATE, ad esempio
Enrico Galli
Link utili: I nostri tutorial | Come inserire: Immagini - Codice - Risolto
Se il forum ti è stato utile, considera di supportarlo con una libera donazione
Avatar utente

Autore del topic
xalbex
Messaggi: 46 | Topic creati
Iscritto il: dom 30 ott 2022, 11:07
Luogo: Parma
Ringraziato: 4 volte

Tricks (misure lente)

Messaggio da xalbex »

Ciao Enrico Galli hai ragione.
Sto provando a seguire la strada del calcolo "unico".
Nel frattempo, mi aiutate a capire una cosa?
Se scrivo questa misura (che funziona correttamente):

Codice: Seleziona tutto

Misura 2 = 
VAR Media = CALCULATE(
    SUMX(
        SUMMARIZE(FBFF, Promo[CP], Cliente[Cliente], Prodotto[Codice]),
        CALCULATE(SUM(FBFF[Ordinato])/DISTINCTCOUNT(Promo[DataRIF]))
    ),
    YEAR(Promo[DataRIF*]) > YEAR(NOW()) - 2,
    Promo[FSO] < NOW(),
    FBFF[Ordinato] <> BLANK()
)

RETURN Media
e la utilizzo in una tabella nella quale inserisco il dettaglio Promo[DataRIF] ottengo una tabella con tutte possibili di DataRIF (anche quelle che "non esistono" per la combinazione Promo[CP], Cliente[Cliente], Prodotto[Codice] di ogni singola riga)?
Non riesco davvero a capire.
Devo utilizzare qualche funzione di manipolazione dei filtri tipo ALL, ALLSELECTED, ALLEXCEPT, KEEPFILTERS (con questa ho provato, leva i dati ridondanti di DataRIF, ma non calcola correttamente la Misura)???
Thanks.
Rispondi