Was sind die Vor- und Nachteile der Aufteilung von Datum und Uhrzeit in separate Felder im Vergleich zur Verwendung des Datetime-Datentyps und der Speicherung des Datums in einem einzelnen Feld?

7

Meine Datenbank ist extrem groß und wächst mit einer Geschwindigkeit von ~ 20 Millionen Zeilen pro Tag. Ich habe Zeitstempeldaten, die wichtig sind, aber der größte Teil der Berichterstattung basiert auf Datumsbereichen und Vergleichen von Woche zu Woche oder Monat zu Monat. Die Zeit wird gelegentlich in den Ergebnismengen angezeigt, jedoch nie als Kriterium verwendet. Angesichts dessen denke ich, dass ich mit einem Index nur für das Datum im Vergleich zu einem kombinierten Datum / Uhrzeit-Feld beträchtlichen Speicherplatz sparen würde. Ich bin mir nicht sicher, ob ich bei meiner Auswahl auch Leistungssteigerungen sehen würde oder ob die Aufteilung in zwei Felder Nachteile hat.

user9674
quelle
1
Ich sehe nur Vor- und Nachteile - mit Ihren Anforderungen - aber ich bin sicher, dass Sie gründlichere Antworten erhalten.
Ypercubeᵀᴹ
1
Wenn ich mit @ypercube einverstanden bin, würde ich vorwärts gehen und auch das Hinzufügen von weekund monthFeldern in Betracht ziehen .
Dekso
Ein Nachteil der Aufteilung besteht darin, dass jemand dieselbe Tabelle in einem ORM-Mapper zuordnen möchte und dieser Mapper einen oder beide dieser Datentypen nicht unterstützt.
JM Hicks
Was die Erwähnung einer engeren Indexbreite angeht, würden Sie dies nicht alleine in Betracht ziehen, sondern auch, ob das Löschen der nicht benötigten Zeitkomponente aus den Indexzeilen möglicherweise die Gesamtzahl der eindeutigen Indexzeilen, die im Index gespeichert werden müssen, erheblich reduzieren würde. Zum Beispiel, wenn der Index hauptsächlich durch die Zeitstempeldaten und die 20 mil definiert ist. Zeilen sind gut genug über die Zeitkomponente verteilt, dann könnte das Eliminieren der Zeitkomponente die Anzahl der Indexzeilen pro Tag um ein Verhältnis von 1000 oder 10 von 1000 zu 1 reduzieren.
JM Hicks

Antworten:

13

Für Berichtszwecke hat die Aufteilung des Feldes in Datum und Uhrzeit einige Vorteile. Einige mögliche Vorteile, die Sie realisieren könnten, sind:

  • Sie können eine Datumsreferenztabelle (ähnlich einer Datumsdimension in einem Data Warehouse) mit Ihrer Aufteilung in Wochen, Monate usw. erstellen. Diese kann am Datum eingegeben und mit einem Join verwendet werden.

  • Die Analyse nach Tageszeit ist mit einem separaten Zeitfeld einfacher. Sie können die Zeit auch auf ein geeignetes Korn runden und eine Referenztabelle erstellen.

  • Der Index wäre etwas schmaler, obwohl jede Blattzeile immer noch eine (IIRC) 6-Byte-Seitenreferenz hat, so dass es insgesamt keine so große Ersparnis ist.

Für Ihre Anwendung erhalten Sie möglicherweise einen Gewinn aus einer Datumsreferenztabelle (erstellen Sie eine gruppierte PK am Datum für eine effiziente Suche), was wahrscheinlich effizienter ist, als die Woche und den Monat auf Ihrer großen Tabelle zu de-normalisieren.

ConcernedOfTunbridgeWells
quelle
3

Die Indexperformance sollte sich nicht ändern.

In einem sortierten Array oder einer sortierten Baumstruktur (dh dem Index) erfordert das Abfragen von "allen Einträgen, bei denen gleich ist" eine Suche nach dem ersten und dem letzten Eintrag im Bereich, genau wie beim Abfragen von "allen Einträgen, bei denen größer oder gleich ist" Mitternacht und kleiner als Mitternacht ".

Was interessant sein könnte, ist ein Index für MONTH(datetimecol>)und andere häufig verwendete Ausdrücke in Ihren Abfragen, mit denen Sie mithilfe eines Indexscans alle Zeilen mit einem passenden Monat finden können, wenn Sie den zusätzlichen Speicherplatz für diesen Index gegen eine höhere Leistung eintauschen möchten.

Von einem Speicherplatz-POV bezweifle ich, dass es im Vergleich zur Größe der Datentabellen wichtig ist.

Simon Richter
quelle