Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
|
|||
|---|---|---|---|
|
#18+
Добрый день, Имеется MSSQL Server 7.0. Исходный размер базы 3,5G. В таблице ( 8 миллионов записей) изменяю тип нескольких полей с bit на tinyint (использую EM 2000). По завешению операции размер фала данных 17G (используемый). Вопросы: 1. Что произошло? 2. Как привести базу в порядок? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2001, 08:55 |
|
||
|
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
|
|||
|---|---|---|---|
|
#18+
1. Измение типов и размерности полей(а также порядок слежования) EM производит через временную таблицу, т.е. создается новая таблица - копируются данные из старой таблицы в новую - старая таблица удаляется - новая таблица переименовывается Соответственно в какой-то момент времени ваши данные - 8 миллионов записей - присутсвуют в базе 2-х экземплярах. Это раз Плюс увеличение размера записи - если у вас, например, было 8 полей типа bit, то в старой таблице занимали они 1 байт, а в новой, соответственно, 8 байт. Это два Плюс, опять же из-за промежуточной таблицы, манипуляции с индексасми(если они есть конечно). Это три Плюс процент/размер, который вы задали для прироста базы. Как именно EM осуществляет конкретную операцию по измению структуры таблицы можно увидеть в Chaning Script(кажется так называется кнопка на панели в design-режиме таблицы) 2. Использовать сжатие файлов. В EM на базе при нажатии на правую кнопку мыши - All tasks - Shrink В T-SQL - DBCC SHRINKDATABASE, DBCC SHRINKFILE ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2001, 09:44 |
|
||
|
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
|
|||
|---|---|---|---|
|
#18+
Дело в том, что Shrink не помогает. Я уже запускал Reindex и Shrink Database. Есть подозрение, что проблему создают индексы созданные сервером автоматически для некоторых полей. Но как это связано с изменением типа поля ( индексов по этим полям нет и не было)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2001, 10:25 |
|
||
|
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
|
|||
|---|---|---|---|
|
#18+
2 Alik: А какой shrink не помогает, shrink database или shrink file? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2001, 10:45 |
|
||
|
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
|
|||
|---|---|---|---|
|
#18+
Конечно, невозможно сжать файл, если он полностью заполнен. Посмотреть заполненность каждого файла(данных и лога) базы можно опять же в All tasks - Shrink - Files... Не буду утверждать, но кажется немного странным создание статистики для полей типа bit. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2001, 10:49 |
|
||
|
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
|
|||
|---|---|---|---|
|
#18+
Я достаточно хорошо знаю где и что находится. Нужна идея. Возможно стоит убить и создать вновь все индексы? Но что делать с "nonclustered, statistics, auto create located on PRIMARY"? ( 2Glory: эти индексы созданы сервером на полях decimal(14, 0)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2001, 11:04 |
|
||
|
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
|
|||
|---|---|---|---|
|
#18+
Так как конструктивных идей не было, я удалил все идексы и статистику, сделал Shrink Files и Shrink Database. В результате размер используемого просьрансьва сократился до 12G. Это меня не устроило. Я создал новую базу ( со всеми таблицами, вьюшками и индексами). После чего перегнал в нее все данные из старой базы ( INSERT INTO Table SELECT * OldDB..Table). Через сорок минут все таблицы были скопированы, размер новой базы 2G. Если кто-то может, пожалуйста объясните это явление!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2001, 14:13 |
|
||
|
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
|
|||
|---|---|---|---|
|
#18+
IMHO вы не до конца представляете себе архитектуру хранения данных в SQL. То, что файл базы данных занимает на диске какой-то объем, вовсе не означает, что реальная информация в нем расположена подряд. Существует минимальная единица объема, выделяемая под объект(ы) - extent - размером 64Kb. Если extent выделен под объект опять же не означает, что он полностью заполняется данными. Для индексов, например, существует fill factor, котрый напрямую влияет на заполняемость extent-ов и значит на общий размер индекса. Поэтому при интенсивной работе с данным появляется элементарная дефрагментация. Информацию о дефрагментации можно получить с помощью DBCC SHOWCONTIG, а борются с ней с помощью DBCC INDEXDEFRAG. Кроме этого можно получить данные о занимаемом объектом объема с помощью sp_spaceused(обратите внимание и на второй параметр - возможно у вас ошибки в базе). Кстати можете сравнить объекты в "старой" и "новой" базах на предмет кто и сколько занимает места. Теперь о статистике. Статистика - это _не индекс_ построенный сервером самостоятельно, но _информация_ о распределении значений в индексируемых столбцах. Нужна она для для планировщика запросов для определения актуальности индекса и принятия решения об использовании/неиспользовании конкретного индекса в конкретном запросе. Т.е. место занимаемое статистикой никак не идет в сравнение с местом, занимаемым индексом (конечно, можно взять количеством...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2001, 12:12 |
|
||
|
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
|
|||
|---|---|---|---|
|
#18+
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 статистика созданная сервером автоматически обрабатывается также как и идекс (достаточно посмотреть выдаваемые сообщения). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2001, 16:58 |
|
||
|
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
|
|||
|---|---|---|---|
|
#18+
Alik, а с чего вы взяли, что размер должен быть меньше? Если только с того, что раньше он был меньше, то Glory вам уже прозрачно намекнул на то, что байт в 8 раз больше, чем бит. Если взять крайний случай - все поля во всех таблицах были bit, а теперь стали tinyint, то размер базы данных должен увеличиться в 8 раз. А у вас он увеличился всего лишь в три с половиной раза... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2001, 13:18 |
|
||
|
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
|
|||
|---|---|---|---|
|
#18+
Я как то тоже боролся с такой проблемой.... правда достаточно давно. Насколько я понимаю "дефрагментация" может быть не только по индексам, но и по самим данным. попробуйте перед 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2001, 13:38 |
|
||
|
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
|
|||
|---|---|---|---|
|
#18+
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. Из-за праздников не мог ответить раньше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2002, 13:14 |
|
||
|
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
|
|||
|---|---|---|---|
|
#18+
А можно каверзный вопрос? А зачем ты изменял bit на tinyint? Случаем не для того, чтобы построить по этим полям индексы? Так ведь они тоже место занимают... Если вы их явно не создавали, то ограничения целостности UNIQUE автоматом приводят к созданию индекса... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2002, 16:41 |
|
||
|
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
|
|||
|---|---|---|---|
|
#18+
> Вот скрипт от 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)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2002, 07:51 |
|
||
|
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
|
|||
|---|---|---|---|
|
#18+
Я думаю, размер новой базы стал больше из-за увеличившихся индексов, созданных с FILLFACTOR = 10. Т.е. на рабочей базе страницы, используемые для индексов, могли быть заполнены существенно больше, чем на 10 %. А при новом создании индексов заполнение индексных страниц стало 10-процентное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2002, 07:51 |
|
||
|
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
|
|||
|---|---|---|---|
|
#18+
FillFactor в 10% для кластерного индекса заставляет все данные (а не только индекс) занимать всего 10% пространства страниц. А мы тут голову ломаем! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2002, 08:38 |
|
||
|
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
|
|||
|---|---|---|---|
|
#18+
Естественно, ведь нижний (последний) слой кластерного индекса - это сами данные. А требование заполнять только 10% относится ко всем страницам индекса, стало быть и к данным в случае кластерного индекса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2002, 08:54 |
|
||
|
Что происходит с размером таблицы после изменения типа поля с bit на tinyint?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2002, 08:57 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32019876&tid=1824383]: |
0ms |
get settings: |
4ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
43ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
30ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 303ms |

| 0 / 0 |
