powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
19 сообщений из 19, страница 1 из 1
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
    #32019830
Alik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день,

Имеется MSSQL Server 7.0. Исходный размер базы 3,5G. В таблице ( 8 миллионов записей) изменяю тип нескольких полей с bit на tinyint (использую EM 2000). По завешению операции размер фала данных 17G (используемый).

Вопросы:
1. Что произошло?
2. Как привести базу в порядок?
...
Рейтинг: 0 / 0
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
    #32019839
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Измение типов и размерности полей(а также порядок слежования) EM производит через временную таблицу, т.е.
создается новая таблица - копируются данные из старой таблицы в новую - старая таблица удаляется - новая таблица переименовывается

Соответственно в какой-то момент времени ваши данные - 8 миллионов записей - присутсвуют в базе 2-х экземплярах. Это раз
Плюс увеличение размера записи - если у вас, например, было 8 полей типа bit, то в старой таблице занимали они 1 байт, а в новой, соответственно, 8 байт. Это два
Плюс, опять же из-за промежуточной таблицы, манипуляции с индексасми(если они есть конечно). Это три
Плюс процент/размер, который вы задали для прироста базы.

Как именно EM осуществляет конкретную операцию по измению структуры таблицы можно увидеть в Chaning Script(кажется так называется кнопка на панели в design-режиме таблицы)

2. Использовать сжатие файлов.
В EM на базе при нажатии на правую кнопку мыши - All tasks - Shrink
В T-SQL - DBCC SHRINKDATABASE, DBCC SHRINKFILE
...
Рейтинг: 0 / 0
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
    #32019844
Alik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дело в том, что Shrink не помогает. Я уже запускал Reindex и Shrink Database.
Есть подозрение, что проблему создают индексы созданные сервером автоматически для некоторых полей. Но как это связано с изменением типа поля ( индексов по этим полям нет и не было)?
...
Рейтинг: 0 / 0
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
    #32019847
MadDog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Alik:
А какой shrink не помогает, shrink database или shrink file?
...
Рейтинг: 0 / 0
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
    #32019848
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечно, невозможно сжать файл, если он полностью заполнен.
Посмотреть заполненность каждого файла(данных и лога) базы можно опять же в All tasks - Shrink - Files...

Не буду утверждать, но кажется немного странным создание статистики для полей типа bit.
...
Рейтинг: 0 / 0
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
    #32019854
Alik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я достаточно хорошо знаю где и что находится. Нужна идея.
Возможно стоит убить и создать вновь все индексы? Но что делать с "nonclustered, statistics, auto create located on PRIMARY"? ( 2Glory: эти индексы созданы сервером на полях decimal(14, 0))
...
Рейтинг: 0 / 0
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
    #32019876
Alik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так как конструктивных идей не было, я удалил все идексы и статистику, сделал Shrink Files и Shrink Database. В результате размер используемого просьрансьва сократился до 12G. Это меня не устроило. Я создал новую базу ( со всеми таблицами, вьюшками и индексами). После чего перегнал в нее все данные из старой базы ( INSERT INTO Table SELECT * OldDB..Table). Через сорок минут все таблицы были скопированы, размер новой базы 2G. Если кто-то может, пожалуйста объясните это явление!!!
...
Рейтинг: 0 / 0
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
    #32019935
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMHO вы не до конца представляете себе архитектуру хранения данных в SQL. То, что файл базы данных занимает на диске какой-то объем, вовсе не означает, что реальная информация в нем расположена подряд. Существует минимальная единица объема, выделяемая под объект(ы) - extent - размером 64Kb. Если extent выделен под объект опять же не означает, что он полностью заполняется данными. Для индексов, например, существует fill factor, котрый напрямую влияет на заполняемость extent-ов и значит на общий размер индекса.
Поэтому при интенсивной работе с данным появляется элементарная дефрагментация. Информацию о дефрагментации можно получить с помощью DBCC SHOWCONTIG, а борются с ней с помощью DBCC INDEXDEFRAG.
Кроме этого можно получить данные о занимаемом объектом объема с помощью sp_spaceused(обратите внимание и на второй параметр - возможно у вас ошибки в базе). Кстати можете сравнить объекты в "старой" и "новой" базах на предмет кто и сколько занимает места.

Теперь о статистике.
Статистика - это _не индекс_ построенный сервером самостоятельно, но _информация_ о распределении значений в индексируемых столбцах. Нужна она для для планировщика запросов для определения актуальности индекса и принятия решения об использовании/неиспользовании конкретного индекса в конкретном запросе. Т.е. место занимаемое статистикой никак не идет в сравнение с местом, занимаемым индексом (конечно, можно взять количеством...)
...
Рейтинг: 0 / 0
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
    #32019963
Alik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Glory:
>Поэтому при интенсивной работе с данным появляется элементарная дефрагментация. Информацию о дефрагментации можно >получить с помощью DBCC SHOWCONTIG, а борются с ней с помощью DBCC INDEXDEFRAG.
>Кроме этого можно получить данные о занимаемом объектом объема с помощью sp_spaceused(обратите внимание и на второй >параметр - возможно у вас ошибки в базе). Кстати можете сравнить объекты в "старой" и "новой" базах на предмет кто и >сколько занимает места.
Спасибо.
Как раз этого мне и вчера и нехватало. После того, как создал новую базу я покопался в BOL и нашел эти разделы, но к сожалению потом.

Но остается неясным один вопос. Вот скрипт от EM по изменению типа поля:

BEGIN TRANSACTION
CREATE TABLE dbo.Tmp_BaseVisitCommonSubject
(
...
Availability int NULL,
...
) ON [PRIMARY]
GO
IF EXISTS(SELECT * FROM dbo.BaseVisitCommonSubject)
EXEC('INSERT INTO dbo.Tmp_BaseVisitCommonSubject (..., Availability, ...)
SELECT ..., CONVERT(int, Availability), ... FROM dbo.BaseVisitCommonSubject TABLOCKX')
GO
DROP TABLE dbo.BaseVisitCommonSubject
GO
EXECUTE sp_rename N'dbo.Tmp_BaseVisitCommonSubject', N'BaseVisitCommonSubject', 'OBJECT'
GO
ALTER TABLE dbo.BaseVisitCommonSubject ADD CONSTRAINT
pkBaseVisitCommonSubject PRIMARY KEY CLUSTERED
(
VisitId,
SubjectId
) WITH FILLFACTOR = 10 ON [PRIMARY]

GO
CREATE NONCLUSTERED INDEX ix_BaseVisitCommonSubjectMosaicId ON dbo.BaseVisitCommonSubject
(
MosaicId
) WITH FILLFACTOR = 10 ON [PRIMARY]
GO
COMMIT

(Я немного сократил, но суть, думаю, осталась)
Если разобраться, ни о каком интенсивном использовании речь не идет. Удаляеться один объект и создается новый. Я понимаю, что в этом случае возможна дефрагментация файла данных, но это легко побеждаеться Shrink Database/File.
По поводу DBCC UPDATEUSAGE:
Речь идет (как я понял) о таблице sysindexes. Но после тотго, как я удалил все индексы, ситуация принципиально не изменилась.
Мне кажется здесь более глубокая проблема.
К сожалению я удалил старую базу (места всегда нехватает) и нельзя будет проверить другие идеи. Но с радостью их прочту.
И последнее:
При запуске dbcc dbreindex статистика созданная сервером автоматически обрабатывается также как и идекс (достаточно посмотреть выдаваемые сообщения).
...
Рейтинг: 0 / 0
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
    #32020029
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alik, а с чего вы взяли, что размер должен быть меньше? Если только с того, что раньше он был меньше, то Glory вам уже прозрачно намекнул на то, что байт в 8 раз больше, чем бит. Если взять крайний случай - все поля во всех таблицах были bit, а теперь стали tinyint, то размер базы данных должен увеличиться в 8 раз. А у вас он увеличился всего лишь в три с половиной раза...
...
Рейтинг: 0 / 0
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
    #32020032
Garry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я как то тоже боролся с такой проблемой....
правда достаточно давно.

Насколько я понимаю "дефрагментация" может быть не только по индексам,
но и по самим данным.

попробуйте перед Srink'ами прогнать

DBCC CHECKALLOC
Checks the allocation and use of all pages in the specified database.


Плюс, если будете использовать sp_spaceused и перед ней можно пустить
DBCC UPDATEUSAGE (T-SQL)
Reports and corrects inaccuracies in the sysindexes table, which may result in incorrect space usage reports by the sp_spaceused system stored procedure.
...
Рейтинг: 0 / 0
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
    #32020190
Alik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2Garya:
Цитирую BOL:
Microsoft® SQL Server™ optimizes the storage used for bit columns. If there are 8 or fewer bit columns in a table, the columns are stored as 1 byte. If there are from 9 through 16 bit columns, they are stored as 2 bytes, and so on.

Т. е. Если в таблице одно из полей типа bit, то после изменения типа этого поля на tinyint, размер таблицы не изменяется. Если таких полей два то размер таблицы должен увеличиться на (Rows * 2) байт но не в двое, так как есть другие поля.

P.S.
Из-за праздников не мог ответить раньше.
...
Рейтинг: 0 / 0
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
    #32020380
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно каверзный вопрос? А зачем ты изменял bit на tinyint? Случаем не для того, чтобы построить по этим полям индексы? Так ведь они тоже место занимают...
Если вы их явно не создавали, то ограничения целостности UNIQUE автоматом приводят к созданию индекса...
...
Рейтинг: 0 / 0
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
    #32020398
Timur Sokolov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Вот скрипт от EM по изменению типа поля:

ALTER TABLE dbo.BaseVisitCommonSubject ADD CONSTRAINT
pkBaseVisitCommonSubject PRIMARY KEY CLUSTERED
(
VisitId,
SubjectId
) WITH FILLFACTOR = 10 ON [PRIMARY]

GO
CREATE NONCLUSTERED INDEX ix_BaseVisitCommonSubjectMosaicId ON dbo.BaseVisitCommonSubject
(
MosaicId
) WITH FILLFACTOR = 10 ON [PRIMARY]
GO

Господа, а не в этом ли проблема такого роста базы (имеется в виду Filfactor = 10)?
...
Рейтинг: 0 / 0
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
    #32020399
Владимир Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю, размер новой базы стал больше из-за увеличившихся индексов, созданных с FILLFACTOR = 10.
Т.е. на рабочей базе страницы, используемые для индексов, могли быть заполнены существенно больше, чем на 10 %.
А при новом создании индексов заполнение индексных страниц стало 10-процентное.
...
Рейтинг: 0 / 0
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
    #32020413
FillFactor в 10% для кластерного индекса заставляет все данные (а не только индекс) занимать всего 10% пространства страниц. А мы тут голову ломаем!
...
Рейтинг: 0 / 0
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
    #32020420
Владимир Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Естественно, ведь нижний (последний) слой кластерного индекса - это сами данные. А требование заполнять только 10% относится ко всем страницам индекса, стало быть и к данным в случае кластерного индекса.
...
Рейтинг: 0 / 0
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
    #32020423
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще одно доказательство полезности коллективного разума
...
Рейтинг: 0 / 0
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
    #32020476
Alik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за участие!
Собака закопалась именно там.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]