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

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

Вопросы:
1. Что произошло?
2. Как привести базу в порядок?
...
Рейтинг: 0 / 0
26.12.2001, 09:44
    #32019839
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
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
26.12.2001, 10:25
    #32019844
Alik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
Дело в том, что Shrink не помогает. Я уже запускал Reindex и Shrink Database.
Есть подозрение, что проблему создают индексы созданные сервером автоматически для некоторых полей. Но как это связано с изменением типа поля ( индексов по этим полям нет и не было)?
...
Рейтинг: 0 / 0
26.12.2001, 10:45
    #32019847
MadDog
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
2 Alik:
А какой shrink не помогает, shrink database или shrink file?
...
Рейтинг: 0 / 0
26.12.2001, 10:49
    #32019848
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
Конечно, невозможно сжать файл, если он полностью заполнен.
Посмотреть заполненность каждого файла(данных и лога) базы можно опять же в All tasks - Shrink - Files...

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

Теперь о статистике.
Статистика - это _не индекс_ построенный сервером самостоятельно, но _информация_ о распределении значений в индексируемых столбцах. Нужна она для для планировщика запросов для определения актуальности индекса и принятия решения об использовании/неиспользовании конкретного индекса в конкретном запросе. Т.е. место занимаемое статистикой никак не идет в сравнение с местом, занимаемым индексом (конечно, можно взять количеством...)
...
Рейтинг: 0 / 0
27.12.2001, 16:58
    #32019963
Alik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
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
28.12.2001, 13:18
    #32020029
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
Alik, а с чего вы взяли, что размер должен быть меньше? Если только с того, что раньше он был меньше, то Glory вам уже прозрачно намекнул на то, что байт в 8 раз больше, чем бит. Если взять крайний случай - все поля во всех таблицах были bit, а теперь стали tinyint, то размер базы данных должен увеличиться в 8 раз. А у вас он увеличился всего лишь в три с половиной раза...
...
Рейтинг: 0 / 0
28.12.2001, 13:38
    #32020032
Garry
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
Я как то тоже боролся с такой проблемой....
правда достаточно давно.

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

попробуйте перед 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
04.01.2002, 13:14
    #32020190
Alik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
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
09.01.2002, 16:41
    #32020380
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
А можно каверзный вопрос? А зачем ты изменял bit на tinyint? Случаем не для того, чтобы построить по этим полям индексы? Так ведь они тоже место занимают...
Если вы их явно не создавали, то ограничения целостности UNIQUE автоматом приводят к созданию индекса...
...
Рейтинг: 0 / 0
10.01.2002, 07:51
    #32020398
Timur Sokolov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
> Вот скрипт от 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
10.01.2002, 07:51
    #32020399
Владимир Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
Я думаю, размер новой базы стал больше из-за увеличившихся индексов, созданных с FILLFACTOR = 10.
Т.е. на рабочей базе страницы, используемые для индексов, могли быть заполнены существенно больше, чем на 10 %.
А при новом создании индексов заполнение индексных страниц стало 10-процентное.
...
Рейтинг: 0 / 0
10.01.2002, 08:38
    #32020413
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
FillFactor в 10% для кластерного индекса заставляет все данные (а не только индекс) занимать всего 10% пространства страниц. А мы тут голову ломаем!
...
Рейтинг: 0 / 0
10.01.2002, 08:54
    #32020420
Владимир Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
Естественно, ведь нижний (последний) слой кластерного индекса - это сами данные. А требование заполнять только 10% относится ко всем страницам индекса, стало быть и к данным в случае кластерного индекса.
...
Рейтинг: 0 / 0
10.01.2002, 08:57
    #32020423
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
Еще одно доказательство полезности коллективного разума
...
Рейтинг: 0 / 0
10.01.2002, 15:05
    #32020476
Alik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
Спасибо за участие!
Собака закопалась именно там.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Что происходит с размером таблицы после изменения типа поля с bit на tinyint? / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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