In Bezug auf die effizienteste Methode, um mehrere Aggregate in einem einzigen gespeicherten Prozess zurückzugeben?
Ich habe eine E-Mail-Anwendung und möchte alle Nachrichten (Posteingang) für einen Benutzer auswählen. Das Problem ist, dass ich den Header-Teil der E-Mails in der Datenbank so normalisiere, dass die Flat-Daten in eine Nachrichtentabelle gelangen und das BCC von, bis, CC und in einer anderen Tabelle gespeichert wird.
Wie können Nachrichten am besten ausgewählt werden (dh die vollständige Nachricht wird denormalisiert), sodass jeder Datensatz alle für die Nachricht relevanten Felder enthält, einschließlich aller Felder der Nachrichtentabelle und aller zugehörigen Datensätze aus der Empfängertabelle, die sich auf die Nachricht beziehen, gemäß PK / FK Beziehung.
Eine Sache, auf die ich großen Wert lege, ist die Effizienz der SQL-Lösung, da dies Code ist, der viele Male ausgeführt wird und wahrscheinlich die am häufigsten ausgeführte SQL der gesamten Datenbank ist
Zum Kontext hier eine Ansicht meines DB-Schemas.
quelle
Antworten:
So würde ich es machen. Ich verwende Coalesce regelmäßig, um Zeilen in getrennte Felder zu platzieren, und es funktioniert immer gut und skaliert gut (solange Sie erkennen, dass eine Unterabfrage IMMER einen Leistungseinbruch verursachen wird).
Wenn Sie es nicht als gespeicherte Prozedur ausführen möchten, können Sie es auch einfach als Tabellenwertfunktion umschreiben.
Ein anderer Ansatz wäre vermutlich ein CTE, aber ich bin mit diesem Ansatz zum Schreiben von Grund auf nicht so vertraut.
Sie könnten sich fragen, wie Coalesce auf diese Weise funktioniert (ich habe es getan, als ich es zum ersten Mal gesehen habe). Grundsätzlich wird eine rekursive Abfrage erstellt, die jeden nachfolgenden Nicht-Null-Wert in der Menge bis zum Ende der Rückgabemenge zurückgibt. Wenn Sie am anderen Ende herauskommen, erhalten Sie eine durch Komas getrennte Liste aller Ergebnisse als einzelne Zeichenfolge.
quelle
Ich würde eine Ansicht namens viewInbox erstellen , die von allen Eins-zu-Eins- Beziehungstabellen erstellt wird. Dies wäre meine Hauptabfrageansicht. Ich würde diese Ansicht (viewInbox) verwenden, um eine Liste aller Posteingangselemente anzuzeigen.
Wenn der Benutzer einen Drilldown in die Nachricht durchführt, bringe ich alle Informationen zurück, einschließlich der Eins-zu-Viele- Beziehungen aus den mehreren To's, CC's und BCC's.
quelle