2017-06-10 5 views
1

Ich habe mehrere Artikel über die Verwendung von Datentypen gelesen, die Daten in SQL Server unterstützen, aber ich bin immer noch unschlüssig, welche Art von Daten zu verwenden.SQL Server smalldatetime vs datetime2

Alle Menschen sagen den neuen und leistungsfähigen datetime2 Typen zu verwenden, aber smalldatetime ist noch bequemer in Bezug auf Speicher (6 Bytes vs 4 Bytes)

Das ist mein Bereich ist:

Eine Tabelle definiert in auf diese Weise:

Date: typeof(<Date type to choose>) 
Value1: typeof(int) 
Value2: typeof(int) 
Value3: typeof(int) 

Dann habe ich diese Anforderungen:

für die Date Spalte, ich brauche Präzision bis zur Minute.

In dieser Tabelle werde ich speichern bis zu 1 Million Datensätze jeden Tag so große große Datenmengen.

Meine Frage ist: muss ich die alte smalldatetype verwenden, die mir 2 mb jeden Tag spart?

ODER

Sollte verwende ich die neuen und leistungsfähigen datetime2 Datentyp?

Dank

+1

Wählen Sie einfach den Datentyp am besten geeignet für das RAN Ge und Präzision, die Sie benötigen, und Sie erhalten Speichervorteile als Nebeneffekt. Wenn Sie keine Sekunden benötigen, verwenden Sie smalldatetime. Siehe https://dba.stackexchange.com/questions/160709/sql-datetime20-vs-datetime22/160713#160713 –

+0

Ich sah diesen Artikel aber immer noch nicht klar, ob es besser ist, 2 Bytes auf einer alten Struktur zu gewinnen oder zu bezahlen 2 Bytes mit einer modernen Struktur –

Antwort

3

Datumsbereiche: small: 1900-01-01 durch 2079.06.06 und datetime2: 0001-01-01 durch 9999-12-31

Lagerung: Wenn Sie dies nicht tun Sekunden brauchen, nur Stunden und Minuten, dann Speicher ist wie SmallDatetime bei 4 Bytes, im Gegensatz zu DateTime2 (0) bei 6 Bytes.

datetime2 ist ein Upgrade im Bereich der Werte, Präzision (keine Rundung!), So sollten Sie mit datetime2 für große Daten gehen.

+0

Keine Notwendigkeit für Sekunden, alle meine Daten werden alle 15 Minuten gespeichert und normalisierte Client-Seite –

2

datetime2(2) ist 6 Bytes und bekommt man nicht nur Sekunden, aber bis zu 2 Plätzen von Millisekunden (00:00:00.00 durch 23:59:59.99).

ist 4 Bytes und hat das Potenzial, Sie 2 Bytes pro Zeile zu speichern. Wenn diese Spalte Teil eines Clustering-Schlüssels ist, dann haben diese 2 Bytes Auswirkungen auf jeden Nonclustered-Index.

Ein wichtiges Merkmal von smalldatetime ist, dass es auf die nächsten Minuten abgerundet wird, anstatt die Sekunden abzukürzen. Abhängig davon, wie die Daten in die Tabelle eingefügt werden und ob dieses Verhalten gewünscht ist oder nicht, benötigen Sie möglicherweise eine zusätzliche Vorverarbeitung dieses Werts, bevor Sie ihn in die Tabelle einfügen.

Beispiel:

create table t (sdt smalldatetime, dt2 datetime2(2)) 
insert into t values 
('2017-01-01T11:22:22.33','2017-01-01T11:22:22.33') 
,('2017-01-01T11:22:33.33','2017-01-01T11:22:33.33') 

select 
    sdt = convert(char(23),sdt,121) 
    , dt2 = convert(char(23),dt2,121) 
from t 

rextester Demo: http://rextester.com/JPMEE57778

kehrt:

+-------------------------+-------------------------+ 
|   sdt   |   dt2   | 
+-------------------------+-------------------------+ 
| 2017-01-01 11:22:00.000 | 2017-01-01 11:22:22.33 | 
| 2017-01-01 11:23:00.000 | 2017-01-01 11:22:33.33 | 
+-------------------------+-------------------------+ 

ich wirklich diese Runden nicht mögen, so dass wahrscheinlich genug für mich wäre, mit datetime2(2) trotz der gehen 2mb pro Tag Einsparungen , es sei denn, war es Teil des Clustering-Schlüssels.

Referenz:

+0

Ich brauche diese Art der Rundung nicht, weil meine Daten clientseitig normalisiert sind, so dass Sekunden immer "00" sind. Daten werden alle 15 Minuten gespeichert –