This is the first in a short series of posts about how I assign efficient data types when designing a new table or database.
Use less space with DATETIME2
We all know that the DATETIME
column uses 8 bytes of space to store the date and time, to an accuracy of a paltry 3 milliseconds.
This used to cause no end of drama in the days before SQL Server 2008 because milliseconds were rounded to end in 0
, 3
or 7
. When trying to calculate the last possible time in a day, you had to work with some wild values like 2016-03-15 23:59:59.997
.
Fortunately, SQL Server 2008 introduced DATETIME2
, which put paid to that drama. We now have a precision of up to 7 places after the decimal, and it still only uses a maximum of 8 bytes!
For example, we can now store a value of 2015-03-15 23:59:59.9999999
which is mind-bogglingly close to midnight, and not worry about inane values ending in a 7
.
Do you really need that precision, though? How about a way to actually use less storage and store more accurate data?
If 0–2 places of precision (after the decimal) requires only 6 bytes, 3–4 places requires 7 bytes, and 5–7 places requires the full 8 bytes, we can save ourselves a whole byte and not lose any precision by using DATETIME2(3)
as a drop-in replacement for DATETIME
.
We get precision down to the millisecond (even more accurate than before) and shave off one byte for every row in that column. In a table with ten million rows, that’s 9.5MB of space we no longer have to store, or query, or index, or back up.
What data efficiency method have you used in production? Let me know on Twitter at @bornsql.