Wir müssen eine Kopie derselben Daten in Energy -Abfrage laden. Energy Question bietet zwei Möglichkeiten, um zweimal die gleichen Daten zu erhalten: Duplikat und Referenz. Schauen wir uns den Unterschied zwischen diesen beiden Merkmalen und wann eine übereinander an.
Einführung
Möglicherweise muss ich dieselben Daten zweimal in Energy -Abfrage und anschließend in Energy BI laden.
Dies kann passieren, wenn ich die Datenspalten teilen oder andere Transformationen in den Daten ausführen muss oder wenn ich Daten aus einer Tabelle auf zwei verschiedene Arten extrahieren muss.
Energy Question bietet uns zwei Funktionen, um dies zu erreichen:
- Duplikat:
Dies dupliziert den M-Code für die Tabelle und erstellt eine neue Tabelle. - Referenz:
Dies nimmt die Ausgabe einer Tabelle an und erstellt eine neue Tabelle. Alle Änderungen an der Quelltabelle sind auch in der Referenzentabelle sichtbar.
Sie könnten argumentieren, dass die Daten bei Verwendung der Referenz einmal aus der Quelle gelesen werden, da ich die Ausgabe einer Tabelle nehme und sie für eine andere Ausgabe wiederverwende.
Darum geht es in diesem Artikel: Ist das wahr oder falsch?
Vorbereitung der Werkzeuge
Ich verwende SQL Server als Datenquelle und SQL -Profiler, um zu analysieren, was in der Datenbank passiert.
SQL Profiler ist ein Software, das den gesamten Datenverkehr auf einer SQL -Serverinstanz abfangen kann.
Glücklicherweise ist SQL Profiler Teil von SQL Server Administration Studio (SSMS) und ist frei zu verwenden.
Sie können dieses Stück auf Medium lesen, um eine detailliertere Beschreibung des SQL Server -Profilers zu erhalten: Mastering SQL Server-Profiler: Eine Schritt-für-Schritt-Anleitung zum Entsperren von Datenbankerkenntnissen
Eine andere Möglichkeit, das Verhalten dieser beiden Merkmale zu analysieren, ist die Leistungsabfragediagnostik.
Ich habe dieses Stück über Medium über Energy Question Diagnostics geschrieben: Analyse von Leistungsanfragen mit Lastspuren
Ich lade Sie ein, es zu lesen, um mehr über dieses Software zu erfahren.
Kehren wir jedoch zum SQL Server -Profiler zurück und wie Sie es starten und auf unser spezifisches Szenario vorbereiten.
Ich kann das SQL -Profil aus dem Startmenü oder direkt aus SSMS starten:

Nach dem Begin muss ich die Verbindung zu meiner lokalen SQL -Serverinstanz auswählen:

Als nächstes habe ich die Spur eingerichtet.
- Ich gebe ihm einen Namen und wähle die TSQL -Vorlage aus, um die Abfragen aus Energy -Abfrage zu verfolgen.
- Ich aktiviere die Choice „zur Datei speichern“ und wähle den Ordner für die Hint -Datei aus.
Ich kann diese Hint -Datei später im Profiler öffnen und sie detaillierter prüfen, wenn ich es wünsche. - Ich wechsle zur zweiten Seite „Ereignisauswahl“
- Ich aktiviere die beiden Optionen „Alle Ereignisse anzeigen“.
- In der Liste aller Ereignisse wähle ich SQL: STMTStarting und SQL: STMTCompleted aus, um den SQL -Code aus den Abfragen abzurufen.
- Ich wähle alle Ereignisse aus, mit Ausnahme der drei unteren SQL.
- Ich wähle die meisten Spalten mit Ausnahme derjenigen, um den Abfragetext, die Begin- und Endzeit, Dauer und andere Statistiken zu verfolgen.
So schaut es nach dem Setup aus (mit der Choice „Alle Ereignisse anzeigen“ deaktiviert):

Zuletzt habe ich einen Filter in meiner Quelldatenbank eingerichtet, um nur den Datenverkehr in dieser Datenbank zu verfolgen:

Ohne diesen Filter bekomme ich den Verkehr in allen Datenbanken. Dies wird für eine Produktionsinstanz überwältigend sein, da es viel Verkehr von anderen Anwendungen und Benutzern geben wird. Ich könnte sogar einen Filter hinzufügen, um die Hint zu beschränken, um nur den Datenverkehr von meinem NTUSERNAME (meine Home windows -Benutzer -ID) zu beobachten, um den gesamten anderen Datenverkehr in der Datenbank auszuschließen.
Jetzt klicke ich auf Ausführen, um die Spur zu starten.
Importieren der Daten in Energy -Abfrage
Ich verwende eine Ansicht in der Datenbank mit dem Namen factonlinesales_withcustomer als meine Quelle.
Ich importiere diese Ansicht in Energy -Abfrage ohne andere Transformationsschritte. Dies führt dazu, dass die Datenabfrage die Daten mit einer einfachen SQL -Abfrage aus der Datenbank erhalten.
Ich kann diese Abfrage ohne Schwierigkeiten im Hint -Protokoll finden.
Erstellen Sie ein Duplikat und überprüfen Sie, was passiert.
Nach dem Importieren der Daten in Energy -Abfrage erstelle ich ein Duplikat der importierten Tabelle und lade die Daten in Energy BI:

Wie erwartet sehe ich die gleiche Abfrage, die zweimal im SQL -Profiler ausgeführt wird:

Sie können sehen, dass die Daten zweimal mit der gleichen Anzahl von Zeilen abgerufen wurden (die letzten beiden Zeilen in der Spur.
Ich habe erwartet, dass dies geschehen würde, da doppelte Kopien des M-Code kopiert, um eine neue Tabelle zu erstellen.
Eine weitere Schlüsselspalte ist Spid. Dies ist die interne Sitzungs -ID in der SQL Server -Instanz. Zwei verschiedene SPIDs zeigen, dass die Energy -Abfrage an Verbindungen getrennt begann, um die Daten zweimal zu erhalten.
Diese Spalte ist wichtig, wenn der Verkehr aus einer Referenzentabelle analysiert wird.
Erstellen Sie eine Referenz und überprüfen Sie, was passiert.
Jetzt versuche ich die Referenzfunktion.
Ich lösche zuerst die Tabelle „factOnLinesales_withcustomer_duplicate“ und erstelle eine Referenz aus der Tabelle „factonLinesales_withcustomer“:

In SQL Profiler kann ich die Ansicht löschen, um nur neue Einträge anzuzeigen, indem ich auf die Radiergummi -Schaltfläche klicke, um die Hint zu löschen (damit werden keine Daten aus der gespeicherten Hint -Datei gelöscht):

Nachdem ich die Daten von Energy BI erfrischt habe, erhalte ich dieses Ergebnis in SQL Profiler:

Erstaunlicherweise wurden die Daten zweimal in der Datenbank gelesen.
Ich kann sehen, dass es definitiv zwei Verbindungen gibt, da die Spaltespid (Sitzungs -ID) zwei verschiedene Zahlen für die beiden SQL hat: STMTCompleted -Einträge.
Dies bedeutet, dass es aus Sicht des Lastverkehrs keinen Unterschied zwischen Duplikatierung und Referenzierung einer Tabelle gibt.
Aber wenn beide den gleichen Verkehr auf der Quelle verursachen, warum sollte ich dann doppelte Referenz in Energy -Abfrage verwenden?
Bei Verwendung der Referenz und beim Duplikat
Vor einiger Zeit schrieb ich einen Artikel über das Umwandeln eines flachen Tisches in ein Sternschema mit Energy -Abfrage: Konvertieren einer flachen Tabelle in ein gutes Datenmodell in Energy Question
In diesem Artikel habe ich beschrieben, dass einige Operationen beim Erstellen einer neuen Tabelle nicht möglich sind, indem sie auf eine vorhandene Tabelle verweist.
Zum Beispiel ermöglicht Energy -Abfrage aufgrund einer kreisförmigen Referenz nicht das Zusammenführen einer Referenzentabelle mit der ursprünglichen Tabelle.
In einem solchen Fall muss ich die ursprüngliche Tabelle duplizieren.
Dies liegt daran, dass eine Referenzentabelle immer auf dem letzten Schritt der Referenzentabelle basiert.
Dies ist der Hauptunterschied zwischen „Duplikat“ und „Referenz“ in Energy -Abfrage:
- Duplikat ist eine völlig neue Final ohne Abhängigkeit von der ursprünglichen Tabelle. Änderungen an der ursprünglichen Tabelle beeinflussen nicht die doppelte Tabelle.
- Eine Referenzentabelle basiert auf dem Ergebnis der Referenzentabelle. Folglich werden Änderungen, die in die Referenzentabelle angewendet werden, automatisch auf die Referenzentabelle angewendet.
Um genau zu sein, werden die Änderungen nicht angewendet, aber die Eingangstabelle ändert sich aufgrund der Änderung der Referenzentabelle.
Wenn Sie jedoch eine Teilmenge aus der ursprünglichen Tabelle extrahieren müssen, ohne die ursprüngliche Tabelle zu ändern, ist Referenz der richtige Weg, insbesondere wenn es wichtig ist, die Ausgabe immer aus der Referenzentabelle zu erhalten.
Wenn Sie eine Tabelle aus derselben Quelle möchten, aber keine Änderungen an der ursprünglichen Tabelle, die auf die neue Tabelle angewendet wird, müssen Sie die ursprüngliche Tabelle duplizieren.
Beachten Sie, dass Duplikat eine Duplikation der Lastlogik bedeutet. Dies bedeutet, dass Sie, wenn Sie eine Änderung der ursprünglichen Tabelle anwenden, möglicherweise auch die Logik in die doppelte Tabelle kopieren müssen.
Potenzial für Konflikte während der Final
Ein weiteres potenzielles Downside ist, dass beim Laden von Daten aus einigen Quellen Lastkonflikte auftreten können. Excel ist eine dieser Quellen, die Probleme verursachen kann.
Die Quelle des Issues ist, dass Energy Question versucht, die Daten parallel zu laden. Einige Quellen sind nicht in der Lage, parallele Verbindungen zu verarbeiten.
In einem solchen Fall müssen Sie einen Parameter ändern, um eine parallele Belastung zu vermeiden:

Der Standardwert beträgt vier.
Wenn Probleme auftreten, müssen Sie möglicherweise entweder einen niedrigeren benutzerdefinierten Wert festlegen oder auf „eine (parallele Belastung deaktivieren) festlegen“, um Probleme insgesamt zu vermeiden.
Abschluss
In der Energy -Abfrage gibt es keinen Unterschied zwischen „Duplikat“ und „Referenz“ in Bezug auf Lastleistung oder Netzwerkverkehr.
Beide laden die Daten unabhängig von der Quelle mit einer separaten Verbindung.
Daher habe ich den Mythos entlarvt, dass „Referenz“ die Lastleistung erhöhen kann.
Es ist jedoch unerlässlich, die Unterschiede dieser beiden Merkmale zu kennen, da sie beim Laden und Transformieren von Daten unterschiedliche Möglichkeiten bieten.
Wie auch immer, beim Laden von Daten aus einer relationalen Datenbank würde ich zwei Abfragen oder zwei Ansichten für die beiden Tabellen erstellen, anstatt eine Transformation in Energy -Abfrage zu verlagern.
Nach Roches Maxim von Datenumwandlung:
Die Daten sollten so weit wie möglich flussaufwärts und nach Bedarf flussaufwärts transformiert werden.
Beim Laden von Textual content, Excel -Dateien oder anderen Quellen, an die ich keine Abfrage senden kann, um die Daten so zu erhalten, wie ich sie benötige, muss ich entweder „Duplikat“ oder „Referenz“ entsprechend dem erforderlichen Ergebnis verwenden.
Referenzen
Wie in meinen vorherigen Artikeln verwende ich den Contoso -Beispiel -Datensatz. Sie können den ContoSoretailDW -Datensatz kostenlos von Microsoft herunterladen Hier.
Die Contoso -Daten können unter der MIT -Lizenz frei verwendet werden, wie beschrieben in diesem Dokument.
Ich habe den Datensatz geändert, um die Daten auf zeitgenössische Daten zu verschieben.