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

Откуда: РФ
Сообщений: 253
Уважаемый ALL,
Возникла проблема: Заменили во всех таблицах CHAR на VARCHAR (с одинаковым размером поля), в вопреки ожиданиям размер базы не уменьшился, а вырос (процентов на 50). Почему? Как уменьшить размер базы? Shrink Table и Shrink Database не помогли.
Обратную замену типа поля просьба не предлагать :)
сервер MSSQL 2008 R2
Заранее благодарю за советы.
29 янв 14, 15:20    [15488635]     Ответить | Цитировать Сообщить модератору
 Re: после замены чаров на варчары размер базы вырос. почему? как лечить?  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 35396
Блог
журнал вырос?
29 янв 14, 15:21    [15488641]     Ответить | Цитировать Сообщить модератору
 Re: после замены чаров на варчары размер базы вырос. почему? как лечить?  [new]
Glory
Member

Откуда:
Сообщений: 104751
filll
в вопреки ожиданиям размер базы не уменьшился, а вырос (процентов на 50).

Что, где и как вы меряли ?
29 янв 14, 15:21    [15488642]     Ответить | Цитировать Сообщить модератору
 Re: после замены чаров на варчары размер базы вырос. почему? как лечить?  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
filll
Уважаемый ALL,
Возникла проблема: Заменили во всех таблицах CHAR на VARCHAR (с одинаковым размером поля), в вопреки ожиданиям размер базы не уменьшился, а вырос (процентов на 50). Почему? Как уменьшить размер базы? Shrink Table и Shrink Database не помогли.
Обратную замену типа поля просьба не предлагать :)
сервер MSSQL 2008 R2
Заранее благодарю за советы.


при замене char на varchar размер поля останется прежним (концевые пробелы)
29 янв 14, 15:24    [15488682]     Ответить | Цитировать Сообщить модератору
 Re: после замены чаров на варчары размер базы вырос. почему? как лечить?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
filll
Возникла проблема: Заменили во всех таблицах CHAR на VARCHAR (с одинаковым размером поля), в вопреки ожиданиям размер базы не уменьшился, а вырос (процентов на 50). Почему? Как уменьшить размер базы? Shrink Table и Shrink Database не помогли.
Наверное, он вырос из за процесса замены, особенно если меняли в графическом интерфейсе SSMS
29 янв 14, 15:25    [15488691]     Ответить | Цитировать Сообщить модератору
 Re: после замены чаров на варчары размер базы вырос. почему? как лечить?  [new]
filll
Member

Откуда: РФ
Сообщений: 253
Критик,
лог файл практически не вырос. Или журнал это что-то другое?

Glory,
сначала удалили индексы, если они были, после запросом:
ALTER TABLE MyT1 ALTER COLUMN K1 varchar(60)
после создавали индексы на измененное поле K1
29 янв 14, 15:29    [15488725]     Ответить | Цитировать Сообщить модератору
 Re: после замены чаров на варчары размер базы вырос. почему? как лечить?  [new]
filll
Member

Откуда: РФ
Сообщений: 253
забыл сказать, что завершающие пробелы после были порезаны.
29 янв 14, 15:30    [15488734]     Ответить | Цитировать Сообщить модератору
 Re: после замены чаров на варчары размер базы вырос. почему? как лечить?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
filll
забыл сказать, что завершающие пробелы после были порезаны.
Так как место освободится? На странице было занято место пробелами, после инменения поля на varchar свободное место на странице появилось, но свободные страницы то не появились.
Нужно было изменять перезаливкой. Или можно щас перестроить кластерный индекс, тогда освободится место, и потом его можно удалить из файла (с некоторой вероятностью)
29 янв 14, 15:39    [15488801]     Ответить | Цитировать Сообщить модератору
 Re: после замены чаров на варчары размер базы вырос. почему? как лечить?  [new]
filll
Member

Откуда: РФ
Сообщений: 253
alexeyvg,
ладно, я бы понял, если бы размер остался прежним, но он существенно вырос!
а может у меня дефрагментация базы большая?
как освободить место, которое было занято завершающими пробелами?
29 янв 14, 15:49    [15488872]     Ответить | Цитировать Сообщить модератору
 Re: после замены чаров на варчары размер базы вырос. почему? как лечить?  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
filll
как освободить место, которое было занято завершающими пробелами?

alexeyvg
...изменять перезаливкой
29 янв 14, 16:01    [15488963]     Ответить | Цитировать Сообщить модератору
 Re: после замены чаров на варчары размер базы вырос. почему? как лечить?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
filll
alexeyvg,
ладно, я бы понял, если бы размер остался прежним, но он существенно вырос!
Думаю, что рост произошёл из за перестройки индексов, на это же тоже нужны ресурсы.
Ну и вообще, это ненаучно :-) Мало ли, что и как там делалось, сейчас уже не установить.
29 янв 14, 22:18    [15491259]     Ответить | Цитировать Сообщить модератору
 Re: после замены чаров на варчары размер базы вырос. почему? как лечить?  [new]
o-o
Guest
предлагаю эксперимент
по удвоению размера при смене char на varchar:

create table dbo.t (id int identity, s char(8000))
 
insert into dbo.t(s) values('a')
  
dbcc ind ('char_test', 't', 1)  -- with row-overflow


PageFID PagePID IAMFID IAMPID ObjectID IndexID PartitionNumber PartitionID iam_chain_type PageType IndexLevel NextPageFID NextPagePID PrevPageFID PrevPagePID
1 79 NULL NULL 2105058535 0 1 72057594038779904 In-row data 10 NULL 0 0 0 0
1 78 1 79 2105058535 0 1 72057594038779904 In-row data 1 0 0 0 0 0

1 IAM-страница и 1 с In-row data

dbcc traceon (3604) 
dbcc page ('char_test', 1, 78, 3) 

привожу только конец вывода, где слоты расписаны:

Slot 0 Column 1 Offset 0x4 Length 4 Length (physical) 4
id = 1
Slot 0 Column 2 Offset 0x8 Length 8000 Length (physical) 8000
s = [Error converting to string (length 8000 bytes)]
-------------------------------------------------------------------
alter table dbo.t alter column s varchar(8000)

dbcc ind ('char_test', 't', 1)  -- with row-overflow

PageFID PagePID IAMFID IAMPID ObjectID IndexID PartitionNumber PartitionID iam_chain_type PageType IndexLevel NextPageFID NextPagePID PrevPageFID PrevPagePID
1 79 NULL NULL 2105058535 0 1 72057594038779904 In-row data 10 NULL 0 0 0 0
1 78 1 79 2105058535 0 1 72057594038779904 In-row data 1 0 0 0 0 0
1 89 NULL NULL 2105058535 0 1 72057594038779904 Row-overflow data 10 NULL 0 0 0 0
1 80 1 89 2105058535 0 1 72057594038779904 Row-overflow data 3 0 0 0 0 0

теперь само значение перекочевало в Row-overflow page (80),
а на исходной странице -- ссылка туда:

dbcc page ('char_test', 1, 78, 3) 

Slot 0 Column 1 Offset 0x4 Length 4 Length (physical) 4
id = 1
Slot 0 Column 67108865 Offset 0x8 Length 0 Length (physical) 8000
DROPPED = NULL
s = [BLOB Inline Root] Slot 0 Column 2 Offset 0x1f4f Length 24 Length (physical) 24
Level = 0 Unused = 0 UpdateSeq = 1
TimeStamp = 1210253312
Link 0
Size = 8000 RowId = (1:80:0)

теперь можно и пробелы порезать:
update dbo.t
set s = 'a' 
------------
dbcc ind ('char_test', 't', 1)  -- with row-overflow


PageFID PagePID IAMFID IAMPID ObjectID IndexID PartitionNumber PartitionID iam_chain_type PageType IndexLevel NextPageFID NextPagePID PrevPageFID PrevPagePID
1 79 NULL NULL 2105058535 0 1 72057594038779904 In-row data 10 NULL 0 0 0 0
1 78 1 79 2105058535 0 1 72057594038779904 In-row data 1 0 0 0 0 0
1 89 NULL NULL 2105058535 0 1 72057594038779904 Row-overflow data 10 NULL 0 0 0 0


как минимум, Row-overflow-ерный IAM остался
29 янв 14, 23:52    [15491546]     Ответить | Цитировать Сообщить модератору
 Re: после замены чаров на варчары размер базы вырос. почему? как лечить?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
filll,

Просто сделайте alter index ... rebuild.
29 янв 14, 23:58    [15491569]     Ответить | Цитировать Сообщить модератору
 Re: после замены чаров на варчары размер базы вырос. почему? как лечить?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
SomewhereSomehow
filll,

Просто сделайте alter index ... rebuild.

Лучше даже alter table ... rebuild;
30 янв 14, 00:00    [15491574]     Ответить | Цитировать Сообщить модератору
 Re: после замены чаров на варчары размер базы вырос. почему? как лечить?  [new]
andy_111
Member

Откуда: Москва
Сообщений: 39
Размер таблицы и должен был вырасти - при изменении типа поля в таблице старое поле физически никуда не девается, место не высвобождается - просто в строки данных дополнительно к нему добавляется новое поле. Надо сделать кластерный индекс, тогда все будет нормально.
30 янв 14, 13:53    [15494470]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить