From 82921c766a12a8242a498201dbd9920f1a576a5d Mon Sep 17 00:00:00 2001 From: Chad Baldwin Date: Tue, 6 Aug 2024 00:52:48 -0400 Subject: [PATCH] New blog post: Decoding datetime2 columnstore segement range values --- _posts/2024-08-07-convert-datetime2-bigint.md | 337 ++++++++++++++++++ .../2024-08-07-convert-datetime2-bigint.png | Bin 0 -> 44386 bytes 2 files changed, 337 insertions(+) create mode 100644 _posts/2024-08-07-convert-datetime2-bigint.md create mode 100644 img/postbanners/2024-08-07-convert-datetime2-bigint.png diff --git a/_posts/2024-08-07-convert-datetime2-bigint.md b/_posts/2024-08-07-convert-datetime2-bigint.md new file mode 100644 index 0000000..a12553e --- /dev/null +++ b/_posts/2024-08-07-convert-datetime2-bigint.md @@ -0,0 +1,337 @@ +--- +layout: post +title: "Decoding datetime2 columnstore segment range values" +description: "Ever queried sys.column_store_segments and wondered how to decode max_data_id and min_data_id for datetime2 values? No? Well, I'm going to show you anyway" +date: 2024-08-07T07:00:00-07:00 +tags: T-SQL +image: img/postbanners/2024-08-07-convert-datetime2-bigint.png +--- + +Disclaimer: I am by no means an expert on columnstore indexes. This was just a fun distraction I ran into and felt like talking about it. I'm always open to constructive criticism on these posts. + +---- + +This is an extension on my previous blog post where I dealt with an issue involving temporal tables utilizing a clustered columnstore index and a data retention policy. I noticed that old rows were still in my history table, even though the data retention cleanup process had just run. + +My guess is because SQL Server keeps multiple rowgroups open at a time while distributing new data into them before compressing the rowgroups. There's likely a small overlap between rowgroups from day to day. So one rowgroup may contain 5 days worth of data, even though my process inserts 14M rows per day. This means the cleanup job may appear to be behind when it's not. + +As part of looking into this issue, I started skimming through the columnstore index system DMVs to see what information I could glean. + +I noticed in `sys.column_store_segments` the `min_data_id` and `max_data_id` columns store very large bigint values in the segments for `datetime2` columns. After doing a bit more googling and tinkering, I found for `bit`/`tinyint`/`smallint`/`int`/`bigint` it stores the min/max of the _actual_ values rather than dictionary lookup values. So I assume it's likely doing the same for `date`/`time`/`datetime`/`datetime2` and storing some sort of bigint representation of the actual value. + +This post is going to focus on `datetime2(7)` datatypes mainly because that's what I was dealing with. Though I'm sure it wouldn't be much work to figure out the other types. + +I should also note...there may be existing blog posts covering this, I couldn't find any. There's also a very good chance this is covered in one of Niko Neugebauer's many columnstore index blogs. But in the end, I really wanted to see if I could figure this out on my own because I was having fun with it. + +---- + +## The problem + +I have a temporal table that contains a few billion rows and I have a data retention policy of 180 days. The period end column in my table is named `ValidTo` and the history table uses a clustered columnstore index, which means the data cleanup job works by dropping whole rowgroups. + +Here's what `sys.column_store_segments` looks like for that column: + +```tsql +SELECT ColumnName = c.[name] + , TypeName = TYPE_NAME(c.system_type_id), c.scale + , s.segment_id, s.min_data_id, s.max_data_id +FROM sys.column_store_segments s + JOIN sys.partitions p ON p.[partition_id] = s.[partition_id] + JOIN sys.columns c ON c.[object_id] = p.[object_id] AND c.column_id = s.column_id +WHERE p.[object_id] = OBJECT_ID('dbo.MyTable_History') + AND c.[name] = 'ValidTo' +ORDER BY s.segment_id; +``` + +```plaintext +| ColumnName | TypeName | scale | segment_id | min_data_id | max_data_id | +|------------|-----------|-------|------------|--------------------|--------------------| +| ValidTo | datetime2 | 7 | 901 | 812451496414559815 | 812453025851490574 | +| ValidTo | datetime2 | 7 | 902 | 812453024026222779 | 812453025718816479 | +| ValidTo | datetime2 | 7 | 907 | 812449298004095678 | 812453476378687270 | +| ValidTo | datetime2 | 7 | 908 | 812452596987479114 | 812453476127092027 | +| ValidTo | datetime2 | 7 | 909 | 812453025927907048 | 812453475318555080 | +| ValidTo | datetime2 | 7 | 910 | 812453476389782465 | 812453477968585804 | +| ValidTo | datetime2 | 7 | 911 | 812453476378999816 | 812453692263928518 | +``` + +So the question is...what the heck do those values represent for a `datetime2` column? + +First things first, let's get this out of the way...this doesn't work: + +```tsql +DECLARE @bigint_value bigint = 812453476378999816; +SELECT CONVERT(datetime2, CONVERT(binary(8), @bigint_value)) + +' +Msg 241, Level 16, State 1, Line 155 +Conversion failed when converting date and/or time from character string. +' +``` + +So much for the easy route. + +---- + +## Maybe it's number of ticks? + +I should mention...At this point, I had no idea how SQL Server stored `datetime2` values internally. Had I known, that probably would have saved me a lot of time. + +My first thought was that this might be something like Unix timestamps where it's the number of seconds/milliseconds/whatever since 1970-01-01 UTC. So that's where I went first. I spent a good amount of time trying to take `812449298004095678` (the min `min_data_id`) and convert it into a date that I assumed was `2024-02-03 10:08:23.1109310` (the `MIN(ValidTo)` in the actual table). + +I tried all sorts of things and came up with nothing...For example, trying to convert `812449298004095678` to the number of ticks (0.0000001 second or 100 nanoseconds) since `0001-01-01 00:00:00.000`, which kept producing values that were WAY too high. You can test this out in PowerShell: + +```powershell +([datetime]'0001-01-01').AddTicks(812449298004095678) +# Returns: Thursday, July 20, 2575 8:03:20 PM +``` + +---- + +## Let's create some more reliable data + +After that failed attempt, I thought maybe I could create a new table with a clustered columnstore index and populate the columns with only a single value. This way each column segment would only represent a single known value, giving me a sort of mapping between known values and their converted value that we're trying to decode. + +The new table schema: + +```tsql +DROP TABLE IF EXISTS dbo.TestCCI; +CREATE TABLE dbo.TestCCI ( + dt0001 datetime2 NOT NULL, -- datetime2 min + dt0001_1tk datetime2 NOT NULL, -- min + 1 tick (100ns) + dt0001_1us datetime2 NOT NULL, -- min + 1 microsecond + dt0001_1ms datetime2 NOT NULL, -- min + 1 millisecond + dt0001_1sec datetime2 NOT NULL, -- min + 1 second + dt0001_1hr datetime2 NOT NULL, -- min + 1 hour + dt0001_12hr datetime2 NOT NULL, -- min + 12 hour + dt0001_1d datetime2 NOT NULL, -- min + 1 day + dt0001_2d datetime2 NOT NULL, -- min + 2 day + dt1753 datetime2 NOT NULL, -- hardcoded date - 1753-01-01 + dt1900 datetime2 NOT NULL, -- hardcoded date - 1900-01-01 + dtMAX datetime2 NOT NULL, -- datetime2 max + + INDEX CCI_TestCCI CLUSTERED COLUMNSTORE, +); +``` + +Populate data script. This script ensures that at least a couple compressed rowgroups are created by inserting at least 1,048,576 * 2 rows. + +```tsql +DECLARE @dt datetime2(7) = '0001-01-01'; + +WITH c1 AS (SELECT x.x FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) x(x)) -- 12 + , c2(x) AS (SELECT 1 FROM c1 x CROSS JOIN c1 y) -- 12 * 12 + , c3(x) AS (SELECT 1 FROM c2 x CROSS JOIN c2 y CROSS JOIN c2 z) -- 144 * 144 * 144 +INSERT INTO dbo.TestCCI ( + dt0001, dt0001_1tk, dt0001_1us, dt0001_1ms, dt0001_1sec, dt0001_1hr, dt0001_12hr, + dt0001_1d, dt0001_2d, dt1753, dt1900, dtMAX +) +SELECT @dt + , DATEADD(NANOSECOND, 100, @dt) -- 1 tick = 100 nanoseconds + , DATEADD(MICROSECOND, 1, @dt) + , DATEADD(MILLISECOND, 1, @dt) + , DATEADD(SECOND, 1, @dt), DATEADD(HOUR, 1, @dt), DATEADD(HOUR, 12, @dt) + , DATEADD(DAY, 1, @dt), DATEADD(DAY, 2, @dt) + , '1753-01-01', '1900-01-01', '9999-12-31 23:59:59.9999999' +FROM c3; +``` + +Here's what that data looks like in `sys.column_store_segments` + +```tsql +SELECT ColumnName = c.[name], MinValue = MIN(s.min_data_id) +FROM sys.column_store_segments s + JOIN sys.partitions p ON p.[partition_id] = s.[partition_id] + JOIN sys.columns c ON c.[object_id] = p.[object_id] AND c.column_id = s.column_id +WHERE p.[object_id] = OBJECT_ID('dbo.TestCCI') +GROUP BY c.column_id, c.[name] +ORDER BY c.column_id; +``` + +```plaintext +| ColumnName | MinValue | +|-------------|---------------------| +| dt0001 | 0 | +| dt0001_1tk | 1 | +| dt0001_1us | 10 | +| dt0001_1ms | 10000 | +| dt0001_1sec | 10000000 | +| dt0001_1hr | 36000000000 | +| dt0001_12hr | 432000000000 | +| dt0001_1d | 1099511627776 | +| dt0001_2d | 2199023255552 | +| dt1753 | 703582988172001280 | +| dt1900 | 762615767467294720 | +| dtMAX | 4015481100312363007 | +``` + +Now we're picking up on a pattern. It seems like my original guess was right to some extent. It is a representation of the number of ticks...Until you roll over to the next day. That part was confusing me because it's pretty obvious that `36000000000` (1 hour) * 24 is not equal to `1099511627776` (1 day). + +The next step was to start examining this in `binary` to see if there is any pattern there. Since we know all of these values represent a `datetime2(7)` value, then we know its 8 bytes. So lets convert it all to their `binary` and `datetime2` representations. + +```plaintext +| datetime2 value | binary - date component | binary - time component | +| ----------------------------|----------------------------|----------------------------------------------| +| 0001-01-01 00:00:00.0000000 | 00000000 00000000 00000000 | 00000000 00000000 00000000 00000000 00000000 | +| 0001-01-01 00:00:00.0000001 | 00000000 00000000 00000000 | 00000000 00000000 00000000 00000000 00000001 | +| 0001-01-01 00:00:00.0000010 | 00000000 00000000 00000000 | 00000000 00000000 00000000 00000000 00001010 | +| 0001-01-01 00:00:00.0010000 | 00000000 00000000 00000000 | 00000000 00000000 00000000 00100111 00010000 | +| 0001-01-01 00:00:01.0000000 | 00000000 00000000 00000000 | 00000000 00000000 10011000 10010110 10000000 | +| 0001-01-01 01:00:00.0000000 | 00000000 00000000 00000000 | 00001000 01100001 11000100 01101000 00000000 | +| 0001-01-01 12:00:00.0000000 | 00000000 00000000 00000000 | 01100100 10010101 00110100 11100000 00000000 | +| 0001-01-02 00:00:00.0000000 | 00000000 00000000 00000001 | 00000000 00000000 00000000 00000000 00000000 | +| 0001-01-03 00:00:00.0000000 | 00000000 00000000 00000010 | 00000000 00000000 00000000 00000000 00000000 | +| 1753-01-01 00:00:00.0000000 | 00001001 11000011 10100001 | 00000000 00000000 00000000 00000000 00000000 | +| 1900-01-01 00:00:00.0000000 | 00001010 10010101 01011011 | 00000000 00000000 00000000 00000000 00000000 | +| 9999-12-31 23:59:59.9999999 | 00110111 10111001 11011010 | 11001001 00101010 01101001 10111111 11111111 | +``` + +Once I converted the data to this view...I immediately recognized the pattern and I already show it above. It appears the date component is stored in the first 3 bytes as the number of days since `0001-01-01` and the time component uses the last 5 bytes as the number of ticks since `00:00:00.0000000`. + +Some of you might know this already...but this is _very_ similar to how SQL Server stores `datetime2` values internally. Unfortunately, I did not know that and I had to learn that the long way. + +---- + +## How do we convert it back to datetime2? + +Well we already know we can't directly convert it. + +My first thought was maybe I can grab the first 3 bytes, and `DATEADD(day, {value}, '0001-01-01')`, then do the same for the last 5 bytes...The problem is, 5 bytes goes beyond the limits of what `DATEADD` can handle, which is limited to int (4 bytes). Unfortunately, there is no `DATEADD_BIG()` function like there is a `DATEDIFF_BIG()`. + +I _could_ handle this with some sort of binary math, or while loop to break that larger number up. But instead, I wanted to focus on how to build a binary representation of a `datetime2` value that can be directly converted + +The problem is, I had no idea how `datetime2` is actually stored in binary, but there's an easy way to find out. + +```tsql +DECLARE @dt2now datetime2 = SYSUTCDATETIME(); +SELECT CONVERT(binary(8), @dt2now); + +' +Msg 8152, Level 16, State 17, Line 158 +String or binary data would be truncated. +' +``` + +Uhhh....wat? Why would a value that is 8 bytes be truncated when converted to an 8 byte binary? + +I'll save you the headache this gave me...Read this blog post that I eventually found: + + + +TL;DR - When converting a `datetime2` value to a `binary` datatype, SQL Server doesn't want to lose precision, so it includes the precision with the converted value. Including the precision adds an extra byte to the value, so we need to use `binary(9)` instead. This also means we need to make sure our conversion logic handles this. + +Let's try that again... + +```tsql +/* The value '0001-01-01 15:16:15.5813889' will create a binary value with all 0's + for the date component and the time component will start and end with a 1. + This will make it easy to identify which bits represent the date and which + represent the time in the converted output so that we can compare it with the + binary of the values we're getting from sys.column_store_segments. +*/ +DECLARE @dt2now datetime2 = '0001-01-01 15:16:15.5813889'; +SELECT CONVERT(binary(9), @dt2now); + +-- RETURNS: 0x070100000080000000 +``` + +This breaks down like so: + +```plaintext + Precision Time Date +0x 0x07 0100000080 000000 +``` + +Well that's weird...because if we use that same timestamp but create a binary value using the method used in the `bigint` value, we get this... + +```plaintext + Date Time +0x 000000 8000000001 (which is 549755813889 as a bigint) +``` + +It took me a second to realize what happened after mentally going back to my old college assembly classes...The first one is stored in little-endian, whereas our bigint is storing it in big-endian...I won't go into detail explaining what that is or how it works, but the basic idea is that the binary data is stored in a different "direction", luckily that's a pretty simple fix. + +---- + +## The solution + +We're finally here...We now have all the information we need to convert the original `bigint` values back to their original `datetime2` form. We know that we need to convert our big-endian value to little-endian while also adding the missing precision information back in. + +One fun thing to keep in mind here is that whether it's a number, string data, date/time, etc, it's all stored in bytes and those bytes can be converted into strings (nvarchar) and treated as such, including things like concatenation. Since I'm working on a SQL Server 2017 instance, I don't have access to the newer left/right shift binary functions. So I'm going to work around it by using concatenation to handle bit shifting. + +```tsql +DECLARE @src_bigint_value bigint, + @src_binary_value binary(8), + @precision binary(1) = 0x07, + @output_binary binary(9); + +SET @src_bigint_value = 549755813889; -- '0001-01-01 15:16:15.5813889' + +-- First we'll convert it to an 8-byte binary +SET @src_binary_value = CONVERT(binary(8), @src_bigint_value) +-- Then We concat the precision value (+ acts as a binary left shift) +SET @output_binary = @src_binary_value + @precision +/* That gets us: 0x000000800000000107 */ + +-- Now let's handle the little-endian conversion to big-endian +-- We'll do this by cheating a bit and treating it like a string +SET @output_binary = CONVERT(binary(9), REVERSE(@output_binary)) +/* That gets us: 0x070100000080000000 */ + +-- All we need to do now is convert it to datetime2... +SELECT CONVERT(datetime2, @output_binary) +-- RETURNS: 0001-01-01 15:16:15.5813889 +``` + +SUCCESS!!! 🥳 + +And that's it! We now have a formula we can reduce down into a one liner and use it to decode the values stored in `sys.column_store_segments` for `datetime2` values. + +## The final test + +I put together the following query to run against `sys.column_store_segments`. It looks only at segments for our table `dbo.MyTable_History` and the `ValidTo` column, which is a `datetime2`. This is the column which helps tell SQL Server which rowgroups are safe to drop based on the data retention policy settings. + +```tsql +DECLARE @dt2_precision binary(1) = 0x07; + +SELECT n.SchemaName, n.ObjectName, n.ColumnName, s.segment_id + , s.min_data_id, s.max_data_id + , x.min_data_val, x.max_data_val, y.min_data_val_age, y.max_data_val_age +FROM sys.column_store_segments s + JOIN sys.partitions p ON p.[partition_id] = s.[partition_id] + JOIN sys.columns c ON c.[object_id] = p.[object_id] AND c.column_id = s.column_id + CROSS APPLY (SELECT SchemaName = OBJECT_SCHEMA_NAME(p.[object_id]), ObjectName = OBJECT_NAME(p.[object_id]), ColumnName = c.[name]) n + CROSS APPLY ( -- Convert bigint values to datetime2 + SELECT min_data_val = CONVERT(datetime2, CONVERT(binary(9), REVERSE(CONVERT(binary(8), s.min_data_id) + @dt2_precision))) + , max_data_val = CONVERT(datetime2, CONVERT(binary(9), REVERSE(CONVERT(binary(8), s.max_data_id) + @dt2_precision))) + ) x + CROSS APPLY ( -- Calculate age of datetime2 values + SELECT min_data_val_age = DATEDIFF(SECOND, x.min_data_val, SYSUTCDATETIME()) / 86400.0 + , max_data_val_age = DATEDIFF(SECOND, x.max_data_val, SYSUTCDATETIME()) / 86400.0 + ) y +WHERE 1=1 + AND p.[object_id] = OBJECT_ID('dbo.MyTable_History') -- table with columnstore index + AND p.index_id = 1 -- clustered columnstore index + AND c.[name] = 'ValidTo' -- target column + AND c.system_type_id = TYPE_ID('datetime2') +ORDER BY n.SchemaName, n.ObjectName, n.ColumnName, s.segment_id +``` + +The result of the query looks like this (minus a few columns since I'm running it for 1 table) + +```plaintext +| segment_id | min_data_id | max_data_id | min_data_val | max_data_val | min_data_val_age | max_data_val_age | +|------------|--------------------|--------------------|-----------------------------|-----------------------------|------------------|------------------| +| 907 | 812449298004095678 | 812453476378687270 | 2024-02-03 10:08:23.1109310 | 2024-02-07 04:02:15.9189798 | 183.7130092 | 179.9672685 | +| 908 | 812452596987479114 | 812453476127092027 | 2024-02-06 10:09:07.9609418 | 2024-02-07 04:01:50.7594555 | 180.7125000 | 179.9675578 | +| 909 | 812453025927907048 | 812453475318555080 | 2024-02-06 22:04:02.0037352 | 2024-02-07 04:00:29.9057608 | 180.2160300 | 179.9684953 | +| 910 | 812453476389782465 | 812453477968585804 | 2024-02-07 04:02:17.0284993 | 2024-02-07 04:04:54.9088332 | 179.9672453 | 179.9654282 | +| 911 | 812453476378999816 | 812453692263928518 | 2024-02-07 04:02:15.9502344 | 2024-02-07 10:02:04.4431046 | 179.9672685 | 179.7173958 | +| 912 | 812453476378687270 | 812453694459519806 | 2024-02-07 04:02:15.9189798 | 2024-02-07 10:05:44.0022334 | 179.9672685 | 179.7148495 | +| 913 | 812453025926031789 | 812453695400109701 | 2024-02-06 22:04:01.8162093 | 2024-02-07 10:07:18.0612229 | 180.2160416 | 179.7137615 | +| 914 | 812452592568429350 | 812453696032378631 | 2024-02-06 10:01:46.0559654 | 2024-02-07 10:08:21.2881159 | 180.7176041 | 179.7130324 | +| 918 | 812453023938866652 | 812453696236467422 | 2024-02-06 22:00:43.0996956 | 2024-02-07 10:08:41.6969950 | 180.2183333 | 179.7128009 | +| 919 | 812453476297895476 | 812453695679676954 | 2024-02-07 04:02:07.8398004 | 2024-02-07 10:07:46.0179482 | 179.9673611 | 179.7134375 | +``` + +The data retention policy for this table is set to 180 days, which means rowgroups containing only data where `ValidTo >= 180 days ago` is safe to drop. Looking at the output of the query above, we can see why SQL Server did not drop some of these rowgroups...all of them have a max ValidTo of ~179 days old, which is not >= 180. Ths is allowing data older than 180 days to live in the table. diff --git a/img/postbanners/2024-08-07-convert-datetime2-bigint.png b/img/postbanners/2024-08-07-convert-datetime2-bigint.png new file mode 100644 index 0000000000000000000000000000000000000000..760c1ec816461e218a0ea3e89db95d92aec9e7d4 GIT binary patch literal 44386 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 oh1=6tWvBn&B~nK|=?WI%J`hoiXjJDd{U*2{K