Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Почему не очищается место в таблице после delete  [new]
Nimua
Member

Откуда: Ростов-на-Дону
Сообщений: 344
Здравствуйте!

Есть огромная таблица, в которой есть старые ненужные записи. Которые не удалялись из-за ошибки в процедуре удаления.
Таблица 450 Гб.
Сейчас процедуру починили. Удаление работает, по отчету Disk Usage by Top Tables кол-во записей каждый день существенно меньше. НО место занимает столько же :( Те же 450 Гб. После чего оно очищается. Причем место Unused 17 Гб.
А места на диске свободного меньше. Получается что оно не доступно? Что с этим обычно делают.

Спасибо.
3 авг 12, 12:17    [12957488]     Ответить | Цитировать Сообщить модератору
 Re: Почему не очищается место в таблице после delete  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
sp_spaceused покажите.
3 авг 12, 12:19    [12957501]     Ответить | Цитировать Сообщить модератору
 Re: Почему не очищается место в таблице после delete  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 35400
Блог
Nimua,

Попробуйте alter table ... rebuild сделать на выходных (т.к. вероятно будет долго), если ваша версия MS SQL позволяет.
3 авг 12, 12:24    [12957539]     Ответить | Цитировать Сообщить модератору
 Re: Почему не очищается место в таблице после delete  [new]
Nimua
Member

Откуда: Ростов-на-Дону
Сообщений: 344
database_namedatabase_sizeunallocated space
wrk481137.94 MB11930.88 MB


reserveddataindex_sizeunused
479458688 KB433404888 KB28325728 KB17728072 KB


Сообщение было отредактировано: 3 авг 12, 12:27
3 авг 12, 12:25    [12957547]     Ответить | Цитировать Сообщить модератору
 Re: Почему не очищается место в таблице после delete  [new]
nezhadnye_my
Guest
не Ваш случай?
Deleting Rows from a Heap
When rows are deleted from a heap the Database Engine may use row or page locking for the operation. As a result, the pages made empty by the delete operation remain allocated to the heap. When empty pages are not deallocated, the associated space cannot be reused by other objects in the database.

To delete rows in a heap and deallocate pages, use one of the following methods.

Specify the TABLOCK hint in the DELETE statement. Using the TABLOCK hint causes the delete operation to take a shared lock on the table instead of a row or page lock. This allows the pages to be deallocated. For more information about the TABLOCK hint, see Table Hints (Transact-SQL).


Use TRUNCATE TABLE if all rows are to be deleted from the table.


Create a clustered index on the heap before deleting the rows. You can drop the clustered index after the rows are deleted. This method is more time consuming than the previous methods and uses more temporary resources.
3 авг 12, 12:27    [12957564]     Ответить | Цитировать Сообщить модератору
 Re: Почему не очищается место в таблице после delete  [new]
SomewhereSomehow
Member

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

На таблице есть кластерный индекс?
3 авг 12, 12:28    [12957568]     Ответить | Цитировать Сообщить модератору
 Re: Почему не очищается место в таблице после delete  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Посмотрите avg_page_space_used_in_percent из sys.dm_db_index_physical_stats для ваших таблиц, из которых вы удаляли записи.
3 авг 12, 12:30    [12957578]     Ответить | Цитировать Сообщить модератору
 Re: Почему не очищается место в таблице после delete  [new]
Nimua
Member

Откуда: Ростов-на-Дону
Сообщений: 344
nezhadnye_my,

Спасибо, truncate мне не подходит а вот tablelock возможно


SomewhereSomehow,

Да, кластерный индекс есть
3 авг 12, 12:40    [12957656]     Ответить | Цитировать Сообщить модератору
 Re: Почему не очищается место в таблице после delete  [new]
Nimua
Member

Откуда: Ростов-на-Дону
Сообщений: 344
Некоторая оговорка в таблицу добавляются данные в режиме 24/7, в общем немного переделаем механизм, поэтому можно будет думаю с tablelock удалять. Потом вообще truncate можно сделать


Александр,

формирую, спасибо
3 авг 12, 12:47    [12957710]     Ответить | Цитировать Сообщить модератору
 Re: Почему не очищается место в таблице после delete  [new]
Nimua
Member

Откуда: Ростов-на-Дону
Сообщений: 344
Гавриленко Сергей Алексеевич,

извините,
спасибо, формируется,
3 авг 12, 12:48    [12957719]     Ответить | Цитировать Сообщить модератору
 Re: Почему не очищается место в таблице после delete  [new]
nezhadnye_my
Guest
Nimua
nezhadnye_my,

Спасибо, truncate мне не подходит а вот tablelock возможно


SomewhereSomehow,

Да, кластерный индекс есть


вообще-то там(Deleting Rows from a Heap)
описан случай, когда кластерного индекса нет, потому и предлагают либо его создать, либо удалять с TABLOCK.
но случай не Ваш.
3 авг 12, 12:58    [12957826]     Ответить | Цитировать Сообщить модератору
 Re: Почему не очищается место в таблице после delete  [new]
Nimua
Member

Откуда: Ростов-на-Дону
Сообщений: 344
меня несколько сбило

автор
Create a clustered index on the heap before deleting the rows. You can drop the clustered index after the rows are deleted. This method is more time consuming than the previous methods and uses more temporary resources.
3 авг 12, 13:15    [12958005]     Ответить | Цитировать Сообщить модератору
 Re: Почему не очищается место в таблице после delete  [new]
Nimua
Member

Откуда: Ростов-на-Дону
Сообщений: 344
Гавриленко Сергей Алексеевич,

А сколько должны формироваться данные - провисел 37 минут, ничего не выдал, при этом его ничего не блокировало
3 авг 12, 13:17    [12958022]     Ответить | Цитировать Сообщить модератору
 Re: Почему не очищается место в таблице после delete  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Nimua
Гавриленко Сергей Алексеевич,

А сколько должны формироваться данные - провисел 37 минут, ничего не выдал, при этом его ничего не блокировало
А смотря с какими параметрами вы его запустили.
3 авг 12, 13:19    [12958039]     Ответить | Цитировать Сообщить модератору
 Re: Почему не очищается место в таблице после delete  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Nimua,

Указывается название таблицы и назнвание кластерного индекса
DBCC DBREINDEX('test01', 'PK_test01', 0) 
3 авг 12, 13:22    [12958073]     Ответить | Цитировать Сообщить модератору
 Re: Почему не очищается место в таблице после delete  [new]
Nimua
Member

Откуда: Ростов-на-Дону
Сообщений: 344
Гавриленко Сергей Алексеевич,


запускала с

select *
FROM sys.dm_db_index_physical_stats (DB_ID(N'wrk'), OBJECT_ID(N'dbo.tmpdata'), NULL , NULL,DETAILED)
3 авг 12, 13:32    [12958180]     Ответить | Цитировать Сообщить модератору
 Re: Почему не очищается место в таблице после delete  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Nimua
Гавриленко Сергей Алексеевич,


запускала с

select *
FROM sys.dm_db_index_physical_stats (DB_ID(N'wrk'), OBJECT_ID(N'dbo.tmpdata'), NULL , NULL,DETAILED)
Зачем сразу DETAILED? Это скан всей таблицы. Начните с SAMPLED.
3 авг 12, 13:33    [12958203]     Ответить | Цитировать Сообщить модератору
 Re: Почему не очищается место в таблице после delete  [new]
Nimua
Member

Откуда: Ростов-на-Дону
Сообщений: 344
Сделала с SAMPLED, провисел 1:50 - сняла :(
3 авг 12, 15:36    [12959243]     Ответить | Цитировать Сообщить модератору
 Re: Почему не очищается место в таблице после delete  [new]
1d0
Member

Откуда: инфа100%
Сообщений: 2521
кластерный индекс надо ребилдеть!
3 авг 12, 16:52    [12959899]     Ответить | Цитировать Сообщить модератору
 Re: Почему не очищается место в таблице после delete  [new]
FORCEGHOSTCLEANUP
Guest
DBCC FORCEGHOSTCLEANUP
3 авг 12, 17:21    [12960059]     Ответить | Цитировать Сообщить модератору
 Re: Почему не очищается место в таблице после delete  [new]
FORCEGHOSTCLEANUP
Guest
FORCEGHOSTCLEANUP
DBCC FORCEGHOSTCLEANUP


кластерный ключ у вас по монотонно возрастающему полю и с конца таблицы вы удаляете кучу данных?

set statistics io on

select top 1 *
from [ваша табличка] with(nolock) 
order by ключ кластерного индекса

set statistics io off
3 авг 12, 17:26    [12960081]     Ответить | Цитировать Сообщить модератору
 Re: Почему не очищается место в таблице после delete  [new]
Nimua
Member

Откуда: Ростов-на-Дону
Сообщений: 344
FORCEGHOSTCLEANUP,

автор
кластерный ключ у вас по монотонно возрастающему полю и с конца таблицы вы удаляете кучу данных?


да, все так :)

вот результаты запроса

Table 'tempdata'. Scan count 1, logical reads 6, physical reads 5, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
6 авг 12, 11:09    [12966629]     Ответить | Цитировать Сообщить модератору
 Re: Почему не очищается место в таблице после delete  [new]
FORCEGHOSTCLEANUP
Guest
Nimua
FORCEGHOSTCLEANUP,

автор
кластерный ключ у вас по монотонно возрастающему полю и с конца таблицы вы удаляете кучу данных?


да, все так :)

вот результаты запроса

Table 'tempdata'. Scan count 1, logical reads 6, physical reads 5, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

это после FORCEGHOSTCLEANUP или до?
если до, то делать его не нужно, GHOST страниц в начале индекса нет.
6 авг 12, 21:27    [12971323]     Ответить | Цитировать Сообщить модератору
 Re: Почему не очищается место в таблице после delete  [new]
Glory
Member

Откуда:
Сообщений: 104751
DBCC SHOWCONTIG ("Myschema.MyTable");
7 авг 12, 10:35    [12973082]     Ответить | Цитировать Сообщить модератору
 Re: Почему не очищается место в таблице после delete  [new]
Nimua
Member

Откуда: Ростов-на-Дону
Сообщений: 344
FORCEGHOSTCLEANUP,

Это до. Ясно, спасибо. А как вы это определили? по небольшому кол-ву чтений?

Glory,

Спасибо, сейчас посмотрю
7 авг 12, 11:08    [12973377]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить