Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как физически хранятся разреженные столбцы SPARSE?  [new]
BERSERC
Member

Откуда:
Сообщений: 442
У кого-нибудь есть описание того, как физически хранятся разреженные столбцы SPARSE?

В MSDN нашел лишь это https://msdn.microsoft.com/ru-ru/library/cc280604.aspx
из чего нашел, что заполненный тип bit вместо 0.125 занимает 5 байт
какая-то сомнительная экономия получается, даже если 90% будет null значений.

не пойму зачем такая избыточность в bit, достаточно же в строке по аналогии с null для var столбцов указать 0 в маске для этого столбца.
9 авг 16, 12:08    [19519532]     Ответить | Цитировать Сообщить модератору
 Re: Как физически хранятся разреженные столбцы SPARSE?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4807
BERSERC,

Может вам ссылку почитать, которую вы сами прислали

Использование разреженных столбцов

Разреженные столбцы — это обычные столбцы, имеющие оптимизированное хранилище для значений NULL. Разреженные столбцы уменьшают пространство, необходимое для хранения значений NULL, однако увеличивается стоимость получения значений, отличных от NULL. Разреженные столбцы следует использовать только в том случае, если экономится не менее чем от 20 до 40 процентов места. Наборы столбцов и разреженные столбцы определяются с помощью инструкций CREATE TABLE и ALTER TABLE.
9 авг 16, 12:25    [19519605]     Ответить | Цитировать Сообщить модератору
 Re: Как физически хранятся разреженные столбцы SPARSE?  [new]
BERSERC
Member

Откуда:
Сообщений: 442
a_voronin,

create table temp(X INT NULL)
create table temp2(X INT SPARSE NULL)

declare @counter int
set @counter = 0
while (@counter < 50000)
BEGIN
 insert into temp(X)
 values(1)

 insert into temp2(X)
 values(1)

 SET @Counter = @Counter + 1
END
 
exec sp_spaceused 'temp'
exec sp_spaceused 'temp2'

drop table temp
drop table temp2



однако увеличивается не только стоимость получения значений отличных от NULL но и занимаемое место значениями отличными от NULL
9 авг 16, 12:39    [19519673]     Ответить | Цитировать Сообщить модератору
 Re: Как физически хранятся разреженные столбцы SPARSE?  [new]
o-o
Guest
BERSERC
однако увеличивается не только стоимость получения значений отличных от NULL но и занимаемое место значениями отличными от NULL

потому что надо читать оригинал, слова пропадать перестанут
KD
Sparse columns reduce the space requirements for NULL values,
allowing you to have many more columns in your table definition,
as long as most of them are NULL.
Using sparse columns requires more overhead to store and retrieve non-NULL values.

да и вообще назначение sparse columns не место экономить,
а использовать уйму колонок:
KD
The Sparse Columns feature allows you to have far more columns that you ever could before.
The limit is now 30,000 columns in a table, with no more than 1,024 of them being non-sparse.
9 авг 16, 12:43    [19519704]     Ответить | Цитировать Сообщить модератору
 Re: Как физически хранятся разреженные столбцы SPARSE?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4807
BERSERC,

Для экономии места пробуйте COLUMNSTORE
9 авг 16, 12:46    [19519722]     Ответить | Цитировать Сообщить модератору
 Re: Как физически хранятся разреженные столбцы SPARSE?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8316
Наилучший эффект по объему будет на типах полей с фиксированной длиной. Чем длиннее, тем эффективнее.
9 авг 16, 13:22    [19519920]     Ответить | Цитировать Сообщить модератору
 Re: Как физически хранятся разреженные столбцы SPARSE?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4807
Вот зацените. SPARSE на фиг не нужен

+
set nocount on

create table temp(X INT NULL)
create table temp2(X INT SPARSE NULL)
create table temp3(X INT)
create table temp4(X INT)

declare @counter int
set @counter = 1
while (@counter < 1001)
BEGIN
insert into temp(X)
values(IIF(@COUNTER % 500 = 0, 1, NULL))

SET @Counter = @Counter + 1
END

INSERT INTO temp
SELECT * FROM temp
INSERT INTO temp
SELECT * FROM temp
INSERT INTO temp
SELECT * FROM temp
INSERT INTO temp
SELECT * FROM temp
INSERT INTO temp
SELECT * FROM temp
INSERT INTO temp
SELECT * FROM temp
INSERT INTO temp
SELECT * FROM temp
INSERT INTO temp
SELECT * FROM temp
INSERT INTO temp
SELECT * FROM temp
INSERT INTO temp
SELECT * FROM temp

INSERT INTO temp2
SELECT * FROM temp

INSERT INTO temp3
SELECT * FROM temp

CREATE CLUSTERED COLUMNSTORE INDEX ICS_temp3 ON temp3

INSERT INTO temp4
SELECT * FROM temp

CREATE CLUSTERED COLUMNSTORE INDEX ICS_temp4 ON temp4 WITH (DATA_COMPRESSION = COLUMNSTORE_ARCHIVE);

exec sp_spaceused 'temp'
exec sp_spaceused 'temp2'
exec sp_spaceused 'temp3'
exec sp_spaceused 'temp4'

drop table temp
drop table temp2
drop table temp3
drop table temp4
9 авг 16, 13:53    [19520113]     Ответить | Цитировать Сообщить модератору
 Re: Как физически хранятся разреженные столбцы SPARSE?  [new]
o-o
Guest
BERSERC
не пойму зачем такая избыточность в bit, достаточно же в строке по аналогии с null для var столбцов указать 0 в маске для этого столбца.

потому что значения хранятся теперь совсем не так.
никто теперь не собирает вместе fixed length columns, var. length columns.
поэтому биты вместе сложены не будут.
а еще теперь на каждое неналловое значение хранится номер его колонки (2 байта)
и последняя позиция хранимого значения, тоже 2 байта.
итого к размеру значения добавляется еще 4 байта.
ну и раз биты вместе теперь не собрать, то на само значение типа бит нужен 1 байт. отсюда и 5.
вот картинкой спарс-вектор, хранящий данные о спарс-колонках и сами их значения

К сообщению приложен файл. Размер - 42Kb
9 авг 16, 14:02    [19520159]     Ответить | Цитировать Сообщить модератору
 Re: Как физически хранятся разреженные столбцы SPARSE?  [new]
o-o
Guest
a_voronin
Вот зацените. SPARSE на фиг не нужен

+
set nocount on

create table temp(X INT NULL)
create table temp2(X INT SPARSE NULL)
create table temp3(X INT)
create table temp4(X INT)

declare @counter int
set @counter = 1
while (@counter < 1001)
BEGIN
insert into temp(X)
values(IIF(@COUNTER % 500 = 0, 1, NULL))

SET @Counter = @Counter + 1
END

INSERT INTO temp
SELECT * FROM temp
INSERT INTO temp
SELECT * FROM temp
INSERT INTO temp
SELECT * FROM temp
INSERT INTO temp
SELECT * FROM temp
INSERT INTO temp
SELECT * FROM temp
INSERT INTO temp
SELECT * FROM temp
INSERT INTO temp
SELECT * FROM temp
INSERT INTO temp
SELECT * FROM temp
INSERT INTO temp
SELECT * FROM temp
INSERT INTO temp
SELECT * FROM temp

INSERT INTO temp2
SELECT * FROM temp

INSERT INTO temp3
SELECT * FROM temp

CREATE CLUSTERED COLUMNSTORE INDEX ICS_temp3 ON temp3

INSERT INTO temp4
SELECT * FROM temp

CREATE CLUSTERED COLUMNSTORE INDEX ICS_temp4 ON temp4 WITH (DATA_COMPRESSION = COLUMNSTORE_ARCHIVE);

exec sp_spaceused 'temp'
exec sp_spaceused 'temp2'
exec sp_spaceused 'temp3'
exec sp_spaceused 'temp4'

drop table temp
drop table temp2
drop table temp3
drop table temp4

чего ценить-то?
для разных целей разные способы достижения.
пускай определяется, ему 30.000 колонок надо или сжатие.
или вы нам сейчас покажете, как 30.000 упаковали в свой колумнстор?
9 авг 16, 14:04    [19520180]     Ответить | Цитировать Сообщить модератору
 Re: Как физически хранятся разреженные столбцы SPARSE?  [new]
BERSERC
Member

Откуда:
Сообщений: 442
o-o,

Спасибо, очень полезная информация!
9 авг 16, 14:14    [19520253]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить