Имя: Пароль:
1C
1С v8
Вопрос про SQL и таблицу, которая не освобождает место.
,
0 ptiz
 
06.05.22
16:59
Есть таблица независимого регистра сведений, некий лог.
Постоянно пишутся новые данные и очищаются старые.
Одно из полей таблицы - строка неограниченной длины (если это важно).
Количество записей примерно постоянно, но занимаемое место на диске не освобождается и только растет с каждым днем.

Всего 700 тыс записей и занято этой таблицей уже 60Гб (из них индексы занимают 300Мб).
Если сделать реструктуризацию таблицы в 1С через конфигуратор (поменять реквизит), то она проходит за пару минут и останется "честных" 2Гб.

Какой командой добиться в SQL аналогичного освобождения места?

Речь не про шринк! 1) на данной базе это слишком долго. 2) эффекта не дает.
Наверняка поможет перекидывание данных во временную, truncate, и перекидывание обратно, но может есть какая-то одна хитрая команда?

DBCC CLEANTABLE и DBCC DBREINDEX - не помогают.
1 Kassern
 
06.05.22
17:18
(0) проверил на ограниченных строках, вне норм очищает, если Набор.Очистить() Набор.Записать()
2 Kassern
 
06.05.22
17:18
*все
3 Kassern
 
06.05.22
17:21
(0) У вас измерение строковое неограниченной длины?)
4 Конструктор1С
 
06.05.22
17:23
(0) SQL Server? Покажи через SSMS сколько места занимают данные и сколько индексы. Скорее всего тебе нужно REBUILD  индексов сделать
5 Конструктор1С
 
06.05.22
17:27
а, невнимательно почитал, с индексами у тебя норм
6 ptiz
 
06.05.22
17:34
7 Конструктор1С
 
06.05.22
17:42
(6) а, так это зарезервированное место. Есть хранимка для очистки
8 Конструктор1С
 
06.05.22
17:56
Не могу найти что-то. А какая версия скуля? В последних версиях есть сжатие
https://docs.microsoft.com/ru-ru/sql/relational-databases/data-compression/enable-compression-on-a-table-or-index
9 H A D G E H O G s
 
06.05.22
18:24
Вот тут пишут, что это невозможно.
Ну, ты можешь скриптом сделать копию, пепебросить туда данные и потом обратно, только так.

https://stackoverflow.com/questions/49610084/sql-server-deleting-updating-lob-data-in-a-heap
10 H A D G E H O G s
 
06.05.22
18:28
Ну и можно попробовать это

Perform ALTER INDEX ALL .. DISABLE to disable all non-clustered indexes;

Perform ALTER INDEX ALL .. REORGANIZE WITH (LOB_COMPACTION = ON) to compact LOB pages of the underlying heap (this will leave the disabled indexes alone);

Perform ALTER TABLE .. REBUILD to rebuild the in-row data of the heap, as well as all data of the indexes, and re-enable them.
11 rphosts
 
07.05.22
07:23
освободить в табличке - перетусовать данные что-бы в блоках оставалось незаполненными только дефолтовое место (10% что-ли) - остальные блоки останутся в файле/файлах базы но будут пустыми, а отдать файловой системе не подразумевается в принципе!
12 ДедМорроз
 
07.05.22
18:00
Во-первых,все зависит от модели восстановления,так как могут храниться как транзакции добавления так и транзакции удаления,а также данные реально не удаляться.
Во-вторых,при удалении записей место освобожается только если очищена вся страница,если остаются страницы хоть с одной записью,то они так и будут жить.
Кроме того,строки неограниченной длины то бишь BLOB при удалении оставляют дыры,которые потом могут быть заняты,но для освобождения этого места нужно делать переупаковку BLOB.
13 Индиго
 
08.05.22
07:53
(0)Выгрузка-загрузка в dt+ shrink
14 Ivan_495
 
08.05.22
19:16
используешь простую модель восстановления?
15 ptiz
 
09.05.22
17:41
(10) Не помогло. Сделал перекидывание во временную + truncate. Не критичная таблица, 2 минуты отрабатывает, впихну в задачи планировщика.
(11) Полная. Но речь про конкретную таблицу, не про файл лога.
"для освобождения этого места нужно делать переупаковку BLOB." - вот что-то не получилось.
Еще есть другой РС без строковых значений, тоже размер непропорциональный данным, но там не критичный рост.
(13) Понятно, что выгрузка через DT всё лечит, но это чересчур.
16 trad
 
09.05.22
18:02
Если этот РС - только как лог и не нужны срезы, то переделать регистр на непериодический.
Первым измерением сделать поле ПериодЛога.
Таким образом кластерный индекс будет соответствовать течению лога и страницы будут обрезаться полностью при удалении старых записей
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.