Aufpassen Jeffrey Wang als Gaststream -Gast mit Reid HavensUnd eines der Dutzend wunderbaren Dinge, die Jeffrey dem Publikum teilte, battle die Liste der Optimierungen, die die DAX -Engine bei der Erstellung eines optimalen Abfrageplans für unsere Maßnahmen erstellt.
Und die, die meine Aufmerksamkeit auf die sogenannten „spärlichen Maßnahmen“ erregte:

Um es einfach zu machen, sobald Sie die Maßnahme definieren, Formelmotor in Vertipaq Fügt der Abfrage einen impliziten, nicht leeren Filter hinzu, mit dem der Optimierer eine vollständige Kreuzung von Dimension Tabellen vermeiden und nur die Zeilen scannen sollte, in denen Datensätze für die Kombination Ihrer Dimensionsattribute wirklich vorhanden sind. Für Leute, die aus der MDX -Welt kommen, magazine die nicht leere Funktion bekannt aussehen, aber lassen Sie uns sehen, wie sie in DAX funktioniert.
Das, was bei mir am meisten Resonanz fand, battle, als Jeffrey das Ersetzen von Rohlingen durch Nullen (oder alle explizite Werte) in Energy BI -Berechnungen ersetzte. Ich habe schon geschrieben Wie Sie mit Blättern umgehen und sie durch Nullen ersetzen könnenAber in diesem Artikel möchte ich mich auf die möglichen Auswirkungen auf diese Entscheidung konzentrieren.
Die Bühne setzen
Bevor wir beginnen, ist ein wichtiger Haftungsausschluss: Die Empfehlung, Clean nicht durch 0 zu ersetzen, ist genau das – eine Empfehlung. Wenn die Geschäftsanfrage 0 anstelle von leer anzeigt, bedeutet dies nicht unbedingt, dass Sie dies ablehnen sollten. In den meisten Szenarien werden Sie wahrscheinlich nicht einmal eine Leistungsabnahme bemerken, aber sie hängt von mehreren verschiedenen Faktoren ab.
Beginnen wir zunächst unsere einfache DAX -Maßnahme:
Gross sales Amt 364 Merchandise =
CALCULATE (
(Gross sales Amt),
FILTER ( ALL ( 'Product'(ProductKey) ), 'Product'(ProductKey) = 364 )
)
Mit dieser Maßnahme möchte ich den Gesamtverkaufsbetrag für das Produkt mit ProductKey = 364 berechnen. Wenn ich den Wert dieses Maßes in die Kartenvisuelle einfügt, und den Leistungsanalysator einschalten, um die Zeiten für die Bearbeitung dieser Abfrage zu überprüfen, erhalte ich die folgenden Ergebnisse:

Die DAX -Abfrage brauchte nur 11 ms, um auszuführen, und als ich zu DAX Studio wechselte, battle die von der Formel -Engine generierte XMSQL recht einfach:

Und wenn ich einen Blick auf den Abfrageplan (physisch) schaue, kann ich sehen, dass die Speicher -Engine nur eine vorhandene Kombination von Werten gefunden hat, um unsere Daten zurückzugeben:

Weitere Zutaten hinzufügen…
Nehmen wir jedoch an, dass die Geschäftsanfrage die Daten für den Produktschlüssel 364 auf täglicher Ebene analysiert. Gehen wir zu unserem Bericht und fügen Sie Daten hinzu:

Das battle wieder sehr schnell! Ich werde jetzt die Metriken im Dax Studio überprüfen:

Dieses Mal wurde die Abfrage um eine Datentabelle erweitert, in der die für die Arbeitsaufbewahrung benötigte Einführung ausgewirkt hat. Anstatt nur 1 Zeile zu finden, ist die Nummer anders:

Natürlich werden Sie keinen Leistungsunterschied zwischen diesen beiden Szenarien bemerken, da der Unterschied nur wenige Millisekunden beträgt.
Aber dies ist nur der Anfang; Wir erwärmen nur unseren Dax -Motor. In beiden Fällen sehen wir, wie Sie vielleicht sehen, nur „gefüllte“ Werte – diese Kombination von Zeilen, in denen unsere beiden Anforderungen erfüllt sind – der Produktschlüssel 364 und nur die Daten, an denen wir Verkäufe für dieses Produkt hatten. Wenn Sie in der obigen Abbildung gründlich nachsehen, sind Daten nicht zusammenhängend und einige fehlen, wie zum Beispiel am 12. Januar bis zum 21. Januar, 21. Januar, 21. Januar.
Dies liegt daran, dass die Formel -Engine clever genug battle, um die Daten zu beseitigen, an denen das Produkt 364 mit dem nicht leeren Filter keine Verkäufe hatte, und deshalb beträgt die Anzahl der Datensätze 58: Wir haben 58 verschiedene Daten, an denen der Verkauf von Produkt 364 nicht leer battle:

Nehmen wir nun an, dass Geschäftsbenutzer diese Daten dazwischen auch sehen möchten, wo das Produkt 364 keinen Umsatz erzielt hat. Die Idee ist additionally, 0 $ Betrag für all diese Daten anzuzeigen. Wie bereits im vorherigen Artikel beschrieben, gibt es mehrere verschiedene Möglichkeiten, die Lücken durch Nullen zu ersetzen, und ich werde die verwenden COALESCE() Funktion:
Gross sales Amt 364 Merchandise with 0 = COALESCE((Gross sales Amt 364 Merchandise),0)
Grundsätzlich das COALESCE Die Funktion überprüft alle angegebenen Argumente (in meinem Fall gibt es nur ein Argument) und ersetzen den ersten leeren Wert durch den von Ihnen angegebenen Wert. Einfach gesagt wird es prüfen, ob der Wert der Verkäufe AMT 364 -Produkte leer ist. Wenn nicht, wird der berechnete Wert angezeigt. Andernfalls ersetzt es Leere durch 0.

Warten Sie, was ?! Warum sehe ich alle Produkte, als ich alles herausfilterte, außer Produkt 364? Geschweige denn das dauerte mein Tisch jetzt mehr als 2 Sekunden, um zu rendern! Überprüfen Sie, was im Hintergrund passiert ist.

Anstatt eine einzige Frage zu erstellen, haben wir jetzt 3 davon. Der erste ist genau der gleiche wie im vorherigen Fall (58 Zeilen). Die verbleibenden Abfragen zielen jedoch auf das Produkt und die Datentabellen ab, wobei alle Zeilen aus beiden Tabellen gezogen werden (die Produkttabelle enthält 2517 Zeilen, während die Datentabelle 1826 enthält). Nicht nur das, werfen Sie einen Blick auf den Abfrageplan:

4,6 Millionen Aufzeichnungen?! Warum um alles in der Welt passiert es?! Lassen Sie mich für Sie rechnen: 2,517 * 1,826 = 4,596.042… Additionally, hier hatten wir ein vollständiges Kreuz zwischen Produkt- und Datumstabellen und zwangen jedes einzelne Tupel (Kombination aus dem Datumsprodukt), um zu überprüfen! Das geschah, weil wir den Motor gezwungen haben, 0 für jedes einzelne Tupel zurückzugeben, das sonst leer zurückkehren würde (und folglich vom Scannen ausgeschlossen werden)!
Dies ist ein vereinfacher Überblick darüber, was passiert ist:

Ob Sie es glauben oder nicht, es gibt eine elegante Lösung, um leere Werte außerhalb des Boxs anzuzeigen (aber nicht mit 0 statt leer). Sie können einfach auf das Feld Datum klicken und dafür wählen Elemente ohne Daten anzeigen:

Dadurch werden auch die leeren Zellen angezeigt, ohne jedoch einen vollständigen Cross-Be part of zwischen dem Produkt und den Datentabellen durchzuführen:

Wir können jetzt alle Zellen (sogar Leerzeichen) sehen, und diese Abfrage hat die Hälfte der Zeit des vorherigen! Lassen Sie uns den von der Formel -Engine erstellten Abfrageplan überprüfen:

Nicht alle Szenarien sind katastrophal!
Zu der Wahrheit zu sagen, wir hätten unsere Maßnahme umschrieben können, um einige unerwünschte Aufzeichnungen auszuschließen, aber es wäre immer noch keine optimale Möglichkeit für die Engine, leere Aufzeichnungen zu beseitigen.
Darüber hinaus gibt es bestimmte Szenarien, in denen das Ersetzen von Rohlingen durch Null keine signifikante Leistungsabnahme verursacht.
Lassen Sie uns die folgende State of affairs untersuchen: Wir zeigen Daten über den Gesamtverkaufsbetrag für jede einzelne Marke an. Und ich werde meine Verkaufsbetragsmaßnahme für Produkt 364 hinzufügen:

Wie zu erwarten battle, battle das ziemlich schnell. Aber was wird passieren, wenn ich mein Maß hinzufüge, das Rohletten durch 0 ersetzt, was im vorherigen Szenario Chaos verursachte:

HM, sieht so aus, als müssten wir keine Strafe in Bezug auf die Leistung zahlen. Lassen Sie uns den Abfrageplan für diese DAX -Abfrage überprüfen:

Abschluss
Wie Jeffrey Wang vorschlug, sollten Sie sich vom Ersetzen von Rohlingen durch Nullen (oder mit anderen expliziten Werten) fernhalten, da dies die Fähigkeit des Abfrageoptimierers erheblich beeinflusst, unnötiges Datenscannen zu beseitigen. Wenn Sie jedoch aus irgendeinem Grund eine Blanko mit einem sinnvollen Wert ersetzen müssen, seien Sie vorsichtig, wann und wie es geht.
Wie üblich hängt es von vielen verschiedenen Aspekten ab – für Spalten mit geringer Kardinalität oder wenn Sie keine Daten aus mehreren verschiedenen Tabellen anzeigen (wie in unserem Beispiel, wenn wir Daten aus Produkt- und Datentabellen kombinieren mussten) oder visuelle Typen, die keine große Anzahl unterschiedlicher Werte (z. B. Karten visuell) anzeigen müssen – Sie können den Leistungspreis zahlen. Wenn Sie jedoch Tabellen/Matrizen/Balkendiagramme verwenden, die viele unterschiedliche Werte anzeigen, überprüfen Sie die Metriken und Abfragepläne, bevor Sie diesen Bericht in einer Produktionsumgebung bereitstellen.
Danke fürs Lesen!
