Dies ist eine Frage der SQL-Theorie. Ich kann ein Beispiel geben, aber ich denke nicht, dass es nötig ist, um meinen Standpunkt zu verdeutlichen. Jeder, der Erfahrung mit SQL hat, wird sofort wissen, wovon ich rede.Wann CTEs zum Verkapseln von Unterergebnissen und wann sich das RDBMS über massive Joins Sorgen machen sollte
Normalerweise verwenden wir Joins, um die Anzahl der Datensätze zu minimieren, die durch die Übereinstimmung der linken und rechten Zeilen entstehen. Unter bestimmten Bedingungen verursachen Joining-Tabellen jedoch eine Multiplikation der Ergebnisse, wenn das Ergebnis alle Permutationen der linken und rechten Datensätze sind.
Ich habe eine Datenbank, die 3 oder 4 solche Joins hat. Dies macht aus ein paar Aufzeichnungen eine Vielzahl. Meine Sorge ist, dass die Tische in der Produktion groß sein werden, also wird die Anzahl dieser verbundenen Reihen immens sein. Außerdem wird in jeder Zeile eine schwere Mathematik ausgeführt, und die Idee, Mathe in doppelten Zeilen auszuführen, reicht aus, um jemanden zum Zittern zu bringen.
Ich habe zwei Fragen. Die erste ist, ist das etwas, das ich kümmern sollte, oder wird SQL Server intelligent erkennen diese Zeilen sind alle Duplikate und optimieren alle Verarbeitung entsprechend?
Die zweite ist, gibt es keinen Vorteil, jeden Teil der Abfrage gruppieren, um nur die unterschiedlichen Werte in den nächsten Teil der Abfrage in Gang zu bringen, wie etwas mit:
WITH t1 AS (
SELECT DISTINCT... [or GROUP BY]
),
t2 AS (
SELECT DISTINCT...
),
t3 AS (
SELECT DISTINCT...
)
SELECT...
ich oft gesehen die Verwendung von DISTINCT auf Unterabfragen angewendet. Es gibt offensichtlich einen Grund dafür. Ich spreche jedoch über etwas anderes und vielleicht subtiler und kniffliger.
SQL Server wird wahrscheinlich nach unten drücken den Rechen skalare Operator auf die minimale Anzahl von Zeilen zu betreiben. Überprüfen Sie den Ausführungsplan. Ich würde logisch nicht unnötige "distinct" Anweisungen eingeben, da dies unnötige Sortierungen verursachen könnte. –
Also die Hunderttausende von Zeilen, die tatsächlich auf nur ein paar Hundert herunterkochen, sind wahrscheinlich "virtuell"? Wenn Sie jedoch "SELECT * FROM T, T, T, T, T, T" sagen, wobei T 10 Zeilen hat, werden 1 Million Zeilen erstellt. Die Frage ist, werden diese nur erstellt, wenn sie gefragt werden?Warum fühlt sich das plötzlich wie die Frage an: "Wenn ein Baum in den Wald fällt und niemand da ist, um ihn zu hören, macht er immer noch ein Geräusch?" lol – IamIC
Ich würde Ihre Datenbank-Design oder Abfrage-Design in Frage stellen, wenn Sie in den verschiedenen von Anfang an backen müssen. – DForck42