Заметки Дмитрия Пилюгина о Microsoft SQL Server 

Twitter RSS
Home SQL Server (все заметки) Недокументированная команда dbcc csindex
formats

Недокументированная команда dbcc csindex

По мере подготовки докладов на тему 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 индексы.
Спасибо за внимание.

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Анти-спам: введите результат (цифрами) *