Denne øvelse vil diskutere kontekstovergang og indlejrede iteratorer. Du lærer vigtigheden af disse enheder, og hvordan de kan være en god kilde til optimering.
Hvis du husker det, sker kontekstovergang, når en rækkekontekst ændres til en tilsvarende filterkontekst. Du skal være opmærksom på, hvad der sker, når der sker en kontekstovergang i dine iteratorer, fordi det ofte kan generere langsomme resultater.
Indholdsfortegnelse
Indlejrede iteratorer versus BEREGN
Hvis en kontekstovergang påkaldes under en iteration, oprettes en materialiseringstabel. Det betyder, at kontekstovergang påkaldes via formlerne i din DAX. Tabellen er ukomprimerede data, der sendes til formelmotoren.
For at demonstrere er det første mål for store salg, der får den aktuelle pris, hvis den er større end eller lig med 500.

Det næste mål er gennemsnittet af det store salg med indlejrede iteratorer.

Det sidste mål får gennemsnittet af Big Sales uden en indlejret iterator og et CallBackDataID.

Kør målingen med den indlejrede iterator. Sørg for at rydde cachen, før du kører, og slå derefter Server Timings og Query Plan til.

Du kan se, at den genererede 3 scanninger, 2 CallBackDataID'er og 15.003 rækker. Dette er en grund til bekymring, fordi der kun er 101 rækker til output. Dette skete, fordi målingen har to iteratorer eller X-funktioner.
Dette er den fuldt udvidede form for den foranstaltning, der blev kørt:

Det itererer Faktasalg-tabellen med. Det gentager derefter igen med CallBackDataID ved hjælp af. Det forkortede format af denne foranstaltning har en underforståetfunktion, der påkalder kontekstovergang og materialiserer tabellen. Derfor trak den 15.003 rækker, selvom der kun er 101 rækker til output.
Kør den anden måling, der ikke har indlejrede iteratorer. Det gentager stadig faktasalgstabellen ved hjælp af AVERAGEX , men den aktuelle pris er uden for funktionen. Den filtrerer de produkter fra, hvor den aktuelle pris er større end eller lig med 500, og beregner derefter gennemsnittet.

Du kan se, at den kun har 2 scanninger, 104 rækker og ikke har et CallBackDataID. Så hvis du bruger CALCULATE , kan du slippe af med de indlejrede iteratorer og CallBackDataID'er .
Konklusion
Der er mange årsager til en langsom ydende DAX. En af dem skyldes indlejrede iteratorer, som forårsager unødvendige kontekstovergange. Disse iteratorer materialiserer flere rækker end nødvendigt, hvilket får dine forespørgsler til at blive langsommere.
Den bedste løsning til dette er at placere den inde i CALCULATE . Dette skaber mindre arbejde for formelmotoren og maksimerer lagermotorens muligheder.