Given a simple row-based table without a PK but with a row-based clustered index like so:
create clustered index [CX_PropertyValue] ON [dbo].[PropertyValue] ([PropertyId], [Value])
Then I wish to add a column store index that is segmented in the same order as the clustered index above:
create nonclustered columnstore index CS_IX_PropertyValue on dbo.PropertyValue(
PropertyId, Value
)
with (drop_existing = on, maxdop = 1); -- maxdop=1 to preserve the order by property
MaxDop hint to preserve order came from: here
Then the following query was used to report the min/max data_id for the PropertyId column and it the full range was reported on each of the 7 segments:
create view [Common].[ColumnStoreSegmentationView]
as
/*---------------------------------------------------------------------------------------------------------------------
Purpose: List ColumnStore table segment min/max of columns.
Source: https://joyfulcraftsmen.com/blog/cci-how-to-load-data-for-better-columnstore-segment-elimination/
https://dba.stackexchange.com/a/268329/9415
Modified By Description
---------- ---------- -----------------------------------------------------------------------------------------
2020.06.02 crokusek/inet Initial Version
---------------------------------------------------------------------------------------------------------------------*/
select --top 20000000000
s.Name as SchemaName,
t.Name as TableName,
i.Name as IndexName,
c.name as ColumnName,
c.column_id as ColumnId,
cs.segment_id as SegmentId,
cs.min_data_id as MinValue,
cs.max_data_id as MaxValue
from sys.schemas s
join sys.tables t
on t.schema_id = s.schema_id
join sys.partitions as p
on p.object_id = t.object_id
join sys.indexes as I
on i.object_id = p.object_id
and i.index_id = p.index_id
join sys.index_columns as ic
on ic.[object_id] = I.[object_id]
and ic.index_id = I.index_id
join sys.columns c
on c.object_id = t.object_id
and c.column_id = ic.column_id
join sys.column_store_segments cs
on cs.hobt_id = p.hobt_id
and cs.column_id = ic.index_column_id
--order by s.Name, t.Name, i.Name, c.Name, cs.Segment_Id
GO
I tried making the clustered index unique which did slightly affect the reported ranges but still was not monotonically increasing.
Any ideas?
Here is a Link that accomplished the segmentation in this manner but I don't see any difference.
Version: Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)