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

Откуда:
Сообщений: 7
Добрый день.

Столкнулся с проблемой и не знаю, с чего подступиться. Таблица, в которой всего 3 строки, занимает 12 ГБ.

select @@version

Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (Intel X86)



sp_spaceused 'mytable'

name     rows  reserved     data         index_size  unused
mytable  3     12377160 KB  12371128 KB  312 KB      5720 KB



select count(*) from mytable

3



select data_type, character_maximum_length, numeric_precision
from information_schema.columns 
where table_name = 'mytable'
order by ordinal_position

data_type  character_maximum_length  numeric_precision
datetime   NULL                      NULL
varchar    30                        NULL
varchar    255                       NULL
varchar    255                       NULL
varchar    255                       NULL
varchar    255                       NULL


Подскажите, пожалуйста, в какую сторону копать? Пока наметил несколько вопросов.

Что занимает 12 ГБ?
Что могло привести к такой ситуации?
Как найти причину?

Сообщение было отредактировано: 27 сен 12, 14:00
27 сен 12, 13:57    [13232043]     Ответить | Цитировать Сообщить модератору
 Re: Таблица с 3 строками занимает  [new]
Glory
Member

Откуда:
Сообщений: 104751
sp_spaceused @objname ='mytable',@updateusage = 'TRUE'
27 сен 12, 13:59    [13232078]     Ответить | Цитировать Сообщить модератору
 Re: Таблица с 3 строками занимает 12 ГБ  [new]
Сергей Васильев
Member

Откуда:
Сообщений: 7
Glory,

Спасибо, но результат не изменился.
Перед
sp_spaceused 'mytable'
я запускал
dbcc updateusage (0)
.
27 сен 12, 14:04    [13232148]     Ответить | Цитировать Сообщить модератору
 Re: Таблица с 3 строками занимает 12 ГБ  [new]
Glory
Member

Откуда:
Сообщений: 104751
Таблица раньше имела другую структуру.
Были удалены какие-то текстовые поля большого размера.
DBCC CLEANTABLE
27 сен 12, 14:08    [13232199]     Ответить | Цитировать Сообщить модератору
 Re: Таблица с 3 строками занимает 12 ГБ  [new]
Сергей Васильев
Member

Откуда:
Сообщений: 7
Glory,

структура таблицы не менялась, удалялись только записи из таблицы.

После
dbcc cleantable(0, mytable)


занятое место не изменилось ни на байт:
sp_spaceused 'mytable',@updateusage = 'TRUE'

name     rows  reserved     data         index_size  unused
mytable  3     12377160 KB  12371128 KB  312 KB      5720 KB


dbcc checkdb выдает
...
DBCC results for 'mytable'.
There are 3 rows in 1546391 pages for object "mytable".
...
CHECKDB found 0 allocation errors and 0 consistency errors in database 'my_db'.
27 сен 12, 14:33    [13232564]     Ответить | Цитировать Сообщить модератору
 Re: Таблица с 3 строками занимает 12 ГБ  [new]
Spartakich
Member

Откуда: Riga
Сообщений: 380
Сергей Васильев,
select t2.* from sys.tables t1 
left join sysindexes t2 on t1.object_id = t2.id
where t1.name = 'Mytable'
27 сен 12, 14:36    [13232601]     Ответить | Цитировать Сообщить модератору
 Re: Таблица с 3 строками занимает 12 ГБ  [new]
Glory
Member

Откуда:
Сообщений: 104751
select * into xxxmytable from mytable
какой размер будет у таблицы xxxmytable ?
27 сен 12, 14:48    [13232718]     Ответить | Цитировать Сообщить модератору
 Re: Таблица с 3 строками занимает 12 ГБ  [new]
Сергей Васильев
Member

Откуда:
Сообщений: 7
Spartakich,

насколько сейчас понимаю, занимает место какой-то индекс.

Glory,
сейчас проверю.

К сообщению приложен файл. Размер - 36Kb
27 сен 12, 14:51    [13232746]     Ответить | Цитировать Сообщить модератору
 Re: Таблица с 3 строками занимает 12 ГБ  [new]
Glory
Member

Откуда:
Сообщений: 104751
И что со счетчиком ghost_record_count в sys.dm_db_index_physical_stats для этой таблице ?
27 сен 12, 14:51    [13232753]     Ответить | Цитировать Сообщить модератору
 Re: Таблица с 3 строками занимает 12 ГБ  [new]
Spartakich
Member

Откуда: Riga
Сообщений: 380
Сергей Васильев,

построй кластерный индекс по любому полю.
потом этот индекс можешь удалить
27 сен 12, 14:53    [13232774]     Ответить | Цитировать Сообщить модератору
 Re: Таблица с 3 строками занимает 12 ГБ  [new]
komrad
Member

Откуда:
Сообщений: 5919
Glory
И что со счетчиком ghost_record_count в sys.dm_db_index_physical_stats для этой таблице ?



select 
OBJECT_NAME(object_id)
index_id,
avg_fragmentation_in_percent,
page_count,
record_count,
ghost_record_count,
version_ghost_record_count 
from sys.dm_db_index_physical_stats(db_id(),object_id('ResultsPV'),null,null,'detailed')


если там не 0, то ставьте SP2 - это баг RTM
27 сен 12, 14:57    [13232804]     Ответить | Цитировать Сообщить модератору
 Re: Таблица с 3 строками занимает 12 ГБ  [new]
komrad
Member

Откуда:
Сообщений: 5919
komrad

...
from sys.dm_db_index_physical_stats(db_id(),object_id('ResultsPV'),null,null,'detailed')


если там не 0, то ставьте SP2 - это баг RTM


название таблицы подставить свое :)
27 сен 12, 14:59    [13232822]     Ответить | Цитировать Сообщить модератору
 Re: Таблица с 3 строками занимает 12 ГБ  [new]
Сергей Васильев
Member

Откуда:
Сообщений: 7
Glory,

в новой таблице данных 16 КБ

ghost_record_count != 0 только в 1 строке. Проверял вот так:
DECLARE @db_id SMALLINT;
DECLARE @object_id INT;

SET @db_id = DB_ID(N'mydb');
SET @object_id = OBJECT_ID(N'mydb.dbo.mytable');

IF @db_id IS NULL
BEGIN;
    PRINT N'Invalid database';
END;
ELSE IF @object_id IS NULL
BEGIN;
    PRINT N'Invalid object';
END;
ELSE
BEGIN;
    SELECT * FROM sys.dm_db_index_physical_stats(@db_id, @object_id, NULL, NULL , 'DETAILED');
END;
GO


Spartakich,

спасибо, сейчас почитаю https://www.sql.ru/articles/mssql/03013101indexes.shtml и сделаю.


komrad,

спасибо за наводку на баг (речь, видимо, идет о http://support.microsoft.com/kb/2622823), SP2 поставлю. Нужны ли после установки какие-либо дополнительные действия, если ghost_record_count != 0?

К сообщению приложен файл. Размер - 37Kb
27 сен 12, 15:33    [13233226]     Ответить | Цитировать Сообщить модератору
 Re: Таблица с 3 строками занимает 12 ГБ  [new]
Spartakich
Member

Откуда: Riga
Сообщений: 380
Сергей Васильев,

у вас там дефрагментированная куча.
создайте кластерный индекс.
27 сен 12, 15:58    [13233458]     Ответить | Цитировать Сообщить модератору
 Re: Таблица с 3 строками занимает 12 ГБ  [new]
Сергей Васильев
Member

Откуда:
Сообщений: 7
Spartakich,

поскольку в таблице нет уникальных ключей, то запустил создание просто по первому столбцу:
create clustered index ix_mytable_event_date on dbo.mytable(event_date)


Запрос выполнялся 14 минут.

После создания кластерного индекса таблица стала занимать 8 КБ.

Спасибо!

Скажите, пожалуйста, что нужно почитать, чтобы понять, почему столько страниц было помечено занятыми?
27 сен 12, 17:28    [13234303]     Ответить | Цитировать Сообщить модератору
 Re: Таблица с 3 строками занимает 12 ГБ  [new]
Spartakich
Member

Откуда: Riga
Сообщений: 380
Сергей Васильев,

http://www.mssqltips.com/sqlservertip/1254/clustered-tables-vs-heap-tables/
27 сен 12, 21:09    [13235318]     Ответить | Цитировать Сообщить модератору
 Re: Таблица с 3 строками занимает 12 ГБ  [new]
Сергей Васильев
Member

Откуда:
Сообщений: 7
Spartakich, спасибо!

Для тех, кто найдет тему поиском, выложу еще несколько найденных материалов:
http://blogs.msdn.com/b/sqlserverstorageengine/archive/tags/index+fragmentation+series/
http://www.sqlskills.com/BLOGS/PAUL/post/A-SQL-Server-DBA-myth-a-day-(2930)-fixing-heap-fragmentation.aspx
28 сен 12, 12:37    [13238028]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить