По мере подготовки докладов на тему Columnstore индексов наткнулся на интересную недокументированную команду dbcc csindex. Никакой информации по ней нашел, по этому поделюсь тем что удалось выяснить самому.
Синтаксис:
dbcc csindex ( {'dbname' | dbid}, rowsetid, --HoBT or PartitionID columnid, rowgroupid, -- segment_id from sys.column_store_segments object type, -- 1 (Segment), 2 (Dictionary), print option -- [0 or 1 or 2] [, start] [, end] )
Использовать можно следующим образом, например, создадим таблицу с колоночным индексом
create table dbo.f (id int identity primary key, d1 int not null, d2 char(10) not null); go with nums as( select top(2000000) n = row_number() over(order by(select 1)) from master..spt_values v1,master..spt_values v2,master..spt_values v3 ) insert f with(tablockx) select n%1000+1, str(n%10+1,10) from nums; go create nonclustered columnstore index csix_f on dbo.f(d1,d2); go
Теперь, посмотрим ид базы и информацию по сегментам (логическим единицам хранения данных колонок):
select db_id(); select * from sys.column_store_segments;
Можно заметить, что segment_id повторяются, это связано с неверно выбранным названием, логичнее было бы назвать эту колонку rowgroup_id. Сегмент же определяется колонкой + группой строк.
Теперь, выполним (замените идентификаторы на те, что получились у вас):
dbcc traceon(3604); dbcc csindex (10,72057594039435264,2,0,1,0); go
В результате увидим служебную информацию по columnstore индексу:
Segment: (2:0) — сегмент для колонки 2 из группы строк 0.
Segment Attributes — атрибуты сегмента, их также можно наблюдать и в DMV sys.column_store_segments.
RLE Header — заголовок Run Length Encoding. Run Length Encoding — это один из методов сжатия данных columnstore, принцип заключается в том, чтобы вместо нескольких повторяющихся значений хранить одно значение и количество его повторений. В данном случае всего хранится RLE Array Count (In terms of Native Units) = 11 значений (значения могут повторяться)
RLE Data — массив самих значений, содержит индекс в структуре RLE, ссылку на значение и количество повторений.
Если пролистать ниже, то можно увидеть информацию по еще одному методу сжатия BitPacking, в данном случае заголовок Bitpack Data Header пустой.
При помощи данной команды можно также смотреть содержимое словаря. Словари применяются для сжатия Dictionary Encoding. Для того, чтобы посмотреть словарь, необходимо указать тип объекта 2.
dbcc csindex (10,72057594039435264,2,0,2,0);
Наверняка, варьируя опции можно получать еще какую-то информацию. Если вам это известно, делитесь в комментариях.
На этом у меня все, и я отправляюсь на sql server user group, где буду рассказывать про Columnstore индексы.
Спасибо за внимание.