Es sieht so aus, als ob ich diesen Rat drei Mal die Woche hier auf SO gebe, vielleicht sollte ich einfach aufgeben und loslassen :-) Nein, das glaube ich nicht:
Verwenden Sie nicht pro Zeile Zeilenfunktionen in Ihren Spaltenberechnungen (oder order by
-Klauseln), wenn Ihre Datenbank gut skalieren soll. Sie sollten die Leistung für Ihren speziellen Fall überprüfen ( messen, nicht raten ), aber das Ausführen von Berechnungen, wenn Lesen die Datenbank beeinflusst, wirkt sich in der Regel auf Ihre Skalierbarkeit aus (dies spielt keine Rolle) für Ihre Adressbuch-Datenbank, aber die Geschäfte, in denen ich arbeite, haben riesige Datenmengen.
Die Anzahl der "Wie bekomme ich meine DB schneller?" Fragen überwiegen bei weitem die Anzahl von "Wie verwende ich weniger Platz?" Einsen. Es ist ein ausgetretener Pfad, um Speicherplatz für die Leistung zu opfern.
Der richtige Zeitpunkt für Berechnungen ist, wenn sich die Daten ändern. Auf diese Weise werden die Kosten der Änderungen über alle Lesevorgänge hinweg amortisiert.
Ich rate dazu, eine weitere Spalte wie dtLastAction
anzulegen, um den Bestellwert zu enthalten. Verwenden Sie dann einen Einfüge- / Aktualisierungstrigger, um ihn auf dtModified
wenn nicht null oder dtPosted
falls dtModified
zu setzen Null. Technisch gesehen verstößt dies gegen 3NF, aber das ist in Ordnung, wenn Sie wissen, was Sie tun, und die Trigger garantieren in diesem Fall die Datenkonsistenz.
Dann indexieren Sie die Spalte dtLastAction
und sehen Sie, wie sich die Geschwindigkeit Ihrer Abfragen zu den (geringeren) Kosten für zusätzliche Arbeit bei Einfügungen und Aktualisierungen verbessert. Ich sage weniger, weil die große Mehrheit der Datenbanktabellen öfter gelesen wird als geschrieben (offensichtlich ist diese Methode nutzlos, wenn Ihre spezielle Situation eine der seltenen Ausnahmen ist).
Alternativ können Sie für diesen speziellen Fall dtModified
und dtPosted
auf denselben Wert setzen, wenn Sie den Eintrag erstellen, dh dtModified
wird niemals sein null. Sie können immer noch Posts erkennen, die noch nie geändert wurden, da diese beiden Datetime-Werte identisch sind.