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

Откуда: СПб
Сообщений: 4
Доброй ночи, есть SQL Server 2008 , удалил кучу записей (несколько миллионов) из двух таблиц, желая тем самым ускорить процесс выборки. Данных в таблицах нет. размер базы на диске не изменился!!! Вырос ldf. LDF уменьшил так "DBCC SHRINKFILE(vca_log, 2)". Почему не изменился (не уменьшился) размер базы после удаления данных? и как это можно победить? Спасибо.
6 ноя 15, 02:13    [18376246]     Ответить | Цитировать Сообщить модератору
 Re: Размер базы не уменьшился после удаления записей из таблиц.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
Павел Тысяцкий
Почему не изменился (не уменьшился) размер базы после удаления данных?
Потому же, почему не уменьшается размер диска при удалении файлов.
Павел Тысяцкий
и как это можно победить?
Уменьшить диск файл базы (шринкануть). Но это замедляет работу с базой из за возникающей фрагментации.
6 ноя 15, 08:38    [18376442]     Ответить | Цитировать Сообщить модератору
 Re: Размер базы не уменьшился после удаления записей из таблиц.  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Павел Тысяцкий,
Почитать что происходит с таблицей при удалении из нее данных.

Области в файле просто отмечаются свободными. Можете перестроить кластерный индекс.
6 ноя 15, 09:57    [18376737]     Ответить | Цитировать Сообщить модератору
 Re: Размер базы не уменьшился после удаления записей из таблиц.  [new]
Павел Тысяцкий
Member

Откуда: СПб
Сообщений: 4
Я удалил данные из начала таблицы. Допустим 10 млн записей. Размер базы не изменился, да и ладно. размер меня устраивает. 2,5 гб. Если я ничего не предпринимаю (не делаю шринкдатабэйс и т.д.) то производительность остается на прежнем уровне и определённое количество новых записей запишутся на свободное место в файле базы. (свободное место, те данные которые я удалил). Размер базы не будет расти приблизительно то время, пока не заполнится то свободное место в файле базы новыми данными. Так как-то получается?
8 ноя 15, 00:44    [18384310]     Ответить | Цитировать Сообщить модератору
 Re: Размер базы не уменьшился после удаления записей из таблиц.  [new]
Павел Тысяцкий
Member

Откуда: СПб
Сообщений: 4
Кстати я удалил 10млн записей подряд из таблицы. Может быть возможно шринкануть и фрагментация конечно возникнет , но она будет мизерной или я не прав?
8 ноя 15, 00:47    [18384313]     Ответить | Цитировать Сообщить модератору
 Re: Размер базы не уменьшился после удаления записей из таблиц.  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
Павел Тысяцкий
Кстати я удалил 10млн записей подряд из таблицы. Может быть возможно шринкануть и фрагментация конечно возникнет , но она будет мизерной или я не прав?
"Подряд" логически не означает, что "подряд" будет и физически.
8 ноя 15, 01:34    [18384380]     Ответить | Цитировать Сообщить модератору
 Re: Размер базы не уменьшился после удаления записей из таблиц.  [new]
Павел Тысяцкий
Member

Откуда: СПб
Сообщений: 4
invm,

Спасибо, этот момент теперь понятен, а повествование в этом сообщении 18384310 есть правда или ложь?
8 ноя 15, 09:34    [18384688]     Ответить | Цитировать Сообщить модератору
 Re: Размер базы не уменьшился после удаления записей из таблиц.  [new]
o-o
Guest
Павел Тысяцкий,
в повествовании не указано, таблица кластерная или куча.
Про кучи вот:
BOL
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 an exclusive 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.

Note
Empty pages can be removed from a heap at any time by using the ALTER TABLE <table_name> REBUILD statement.
8 ноя 15, 10:04    [18384705]     Ответить | Цитировать Сообщить модератору
 Re: Размер базы не уменьшился после удаления записей из таблиц.  [new]
o-o
Guest
Павел Тысяцкий
Кстати я удалил 10млн записей подряд из таблицы. Может быть возможно шринкануть и фрагментация конечно возникнет , но она будет мизерной или я не прав?

Откуда нам знать, что еще у вас в базе?
Вот пример похожей ситуации.
Рэндал удаляет таблицу из начала файла базы
и делает шринк.
Расположенная за этой кластерная таблица фрагментируется полностью,
порядок физического расположения ее страниц инвертируется.
http://www.sqlskills.com/blogs/paul/why-you-should-not-shrink-your-data-files/
8 ноя 15, 10:33    [18384740]     Ответить | Цитировать Сообщить модератору
 Re: Размер базы не уменьшился после удаления записей из таблиц.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
Павел Тысяцкий
Так как-то получается?
Да.
Но вообще зависит от организации таблицы.

Если у вас кластерный индекс, и вы удаляете данные "из начала таблицы", в соответствии с этим индексом, то всё правильно.

А если кластерный индекс другой, или вообще куча, то данные могут удалиться из каждой страницы "понемножку", тогда свободное место будет распределено в этих страницах, и может быть использовано не для любых данных.
8 ноя 15, 11:44    [18384834]     Ответить | Цитировать Сообщить модератору
 Re: Размер базы не уменьшился после удаления записей из таблиц.  [new]
o-o
Guest
alexeyvg
Павел Тысяцкий
Так как-то получается?

А если кластерный индекс другой, или вообще куча, то данные могут удалиться из каждой страницы "понемножку", тогда свободное место будет распределено в этих страницах, и может быть использовано не для любых данных.

Про кучу еще раз: никакие другие данные, кроме данных самой кучи, не будут размещены на захапанных под кучу абсолютно пустых невысвобожденных страницах.
Но под новые данные именно этой кучи они как раз и будут использованы под *любые* данные.
Цитата из BOL по этому поводу выше, статья DELETE
8 ноя 15, 12:39    [18384935]     Ответить | Цитировать Сообщить модератору
 Re: Размер базы не уменьшился после удаления записей из таблиц.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
o-o
alexeyvg
А если кластерный индекс другой, или вообще куча, то данные могут удалиться из каждой страницы "понемножку", тогда свободное место будет распределено в этих страницах, и может быть использовано не для любых данных.

Про кучу еще раз: никакие другие данные, кроме данных самой кучи, не будут размещены на захапанных под кучу абсолютно пустых невысвобожденных страницах.
Но под новые данные именно этой кучи они как раз и будут использованы под *любые* данные.
Да, всё правильно; это я так витеевато выражался "не для любых", потому что говорил ещё и про вариант с кластерным индексом, но при том, что из страниц частично удаляются данные :-)
9 ноя 15, 00:30    [18386786]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить