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

Откуда:
Сообщений: 128
У меня в таблице несколько полей varchar(50) NULL по которым все значения NULL. Решил если обьявить их, как SPARSE, то место занимаемое таблицей уменьшится. Выполнил команду
alter table tbl_name alter column col_name varchar(50) SPARSE NULL 
. Затем удалил и заново создал кластеный индекс, обновил стастистику, но размер таблицы остался без изменений (смотрю в MS Management Studio в Properties таблицы).
Как сделать чтобы размер уменьшился (с помощью SPARSE)?

версия SQL:
Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (X64)   Mar 29 2009 10:11:52   Copyright (c) 1988-2008 Microsoft Corporation  Enterprise Edition (64-bit) on Windows NT 5.2 <X64> (Build 3790: Service Pack 2) 
22 дек 09, 12:52    [8101052]     Ответить | Цитировать Сообщить модератору
 Re: SPARSE колонки  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Life
Решил если обьявить их, как SPARSE, то место занимаемое таблицей уменьшится
На сколько мегабайт?
22 дек 09, 12:59    [8101120]     Ответить | Цитировать Сообщить модератору
 Re: SPARSE колонки  [new]
Life
Member

Откуда:
Сообщений: 128
Без SPARSE значение NULL для типа varchar занимает 2 байта. Со SPARCE должно занимать 0. Значит размер должен уменьшится на столько: [кол-во строк таблицы]*[кол-во полей sparce]*2 байта.
Или я ошибаюсь?
22 дек 09, 13:06    [8101173]     Ответить | Цитировать Сообщить модератору
 Re: SPARSE колонки  [new]
Glory
Member

Откуда:
Сообщений: 104760
NULL-ые varchar и так не занимают места в записи
22 дек 09, 13:10    [8101214]     Ответить | Цитировать Сообщить модератору
 Re: SPARSE колонки  [new]
Life
Member

Откуда:
Сообщений: 128
Glory
NULL-ые varchar и так не занимают места в записи

Где можно увидеть это?

Я запустил такой скрипт:
create table temp(data varchar(500) NULL)
create table temp2(data varchar(500) NOT NULL)

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

 insert into temp2(data)
 values('')

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

drop table temp
drop table temp2
Результат:
name rows reserved data index_size unused
temp 50000 584 KB 576 KB 8 KB 0 KB
name rows reserved data index_size unused
temp 50000 584 KB 576 KB 8 KB 0 KB
22 дек 09, 13:56    [8101674]     Ответить | Цитировать Сообщить модератору
 Re: SPARSE колонки  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Без SPARSE значение NULL для типа varchar занимает 2 байта.
> Со SPARCE должно занимать 0. Значит размер должен уменьшится на столько:
> [кол-во строк таблицы]*[кол-во полей sparce]*2 байта.
> Или я ошибаюсь?

не настолько все однозначно. эти самые 2 байта (позиция, с которой начинается
varchar-значение) не всегда хранятся и для обычных (не sparse) столбцов.

Posted via ActualForum NNTP Server 1.4

22 дек 09, 14:06    [8101758]     Ответить | Цитировать Сообщить модератору
 Re: SPARSE колонки  [new]
Life
Member

Откуда:
Сообщений: 128
> не настолько все однозначно. эти самые 2 байта (позиция, с которой начинается
> varchar-значение) не всегда хранятся и для обычных (не sparse) столбцов.
А в каком случае хранится в каком не хранится, не подскажете?
22 дек 09, 14:12    [8101813]     Ответить | Цитировать Сообщить модератору
 Re: SPARSE колонки  [new]
Glory
Member

Откуда:
Сообщений: 104760
 insert into temp2(data)
 values('A')
22 дек 09, 14:15    [8101854]     Ответить | Цитировать Сообщить модератору
 Re: SPARSE колонки  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> А в каком случае хранится в каком не хранится, не подскажете?

не хранится, если null-ы или пустые строки в конец записи (имеется в виду порядок
физического хранения! - он может отличаться от того, в каком
порядке столбцы перечислены при создании таблицы) попадают, насколько
я могу судить. это все, правда, чисто мои личные наблюдения - пруфлинков
не дам. могу пример только с dbcc page привести.

Posted via ActualForum NNTP Server 1.4

22 дек 09, 14:22    [8101921]     Ответить | Цитировать Сообщить модератору
 Re: SPARSE колонки  [new]
PokeMan
Member

Откуда: MOSKAU
Сообщений: 312
После указания sparse для уже существующих страниц ничего не меняется.
вот тут обсуждалось

т.е. как говорил увожаемый daw важен порядок физического хранения. Имеется маска на var-поля (?) и массив-смещений для не NULL значений (?) т.е. если все колонки NULL то SPARSE не даст ничего, если нет то эффект будет но (как я понял гомеапатический) все зависит от количества колонок.
тут про var-ы и и NULL-ы без sparse и с

Поправте плиз если я где с выводами ступил.

P.S.: скрипт Life-а навел на крамольную мысль ... как хроняться значения NULL и '' в var-полях?
23 дек 09, 11:24    [8105913]     Ответить | Цитировать Сообщить модератору
 Re: SPARSE колонки  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> P.S.: скрипт <https://www.sql.ru/forum/actualpost.aspx#8101674> Life-а
> навел на крамольную мысль ... как хроняться значения NULL и '' в var-полях?

всмысле? если про разницу - то null от пустой строки только значением
бита в null-bitmap отличается.

Posted via ActualForum NNTP Server 1.4

23 дек 09, 11:54    [8106234]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить