Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Очистка BLOB полей в большой таблице
|
|||
|---|---|---|---|
|
#18+
Коллеги, нужен совет экспертов: SQL: Microsoft SQL Server 2008 (SP4) - 10.0.6000.29 (X64) ; Enterprise Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) Есть большая таблица в режиме 7х24, с 3 BLOB полями. В неё идет интенсивная запись, 10 - 300 строк в секунду. По ночам стартует процесс очистки, который страсывает блоб поля для запиcей старше Х дней в NULL. Некоторые блоб поля для некоторых строк остаются несброшенными. Проблема в том, что этом место, занятое блобами очищается не полностью. В результате приходится периодически перезаливать всю таблицу, и таблица становится в 8-10 раз меньше! Например сейчас таблица весит 2,6 ТБ, после перезаливки 0,26 ТБ: TabRowsCntReservedMBDataMBPagesCntindex_sizeMBunusedMBдо перезаливки53376923026206352541191325272474728926551после перезаливки5268295482613281968892520187963934504 (разницу в количестве строк пожалуйста игнорируйте) Есть ли идеи, как тожно очищать блоб поля без необходитости "ручной" перезаливки? PS: Что приходит в голову: Приделать к таблице поле "Cleaned" и партиционировать таблицу по нему. При очиске блоб полей устанавливать Cleaned=1, в надежде, что это повлечёт перемещение записей в другую партицию - т.е. как бы неявную перезаливку. Будет ли такой трюк работать? Структура таблицы: Таблица: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Измерения: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2019, 12:30 |
|
||
|
Очистка BLOB полей в большой таблице
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2019, 13:59 |
|
||
|
Очистка BLOB полей в большой таблице
|
|||
|---|---|---|---|
|
#18+
Alexander Us, а как реагирует на шринк и реорганизация индексов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2019, 14:03 |
|
||
|
Очистка BLOB полей в большой таблице
|
|||
|---|---|---|---|
|
#18+
invm, спасибо, на днях попобую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2019, 14:27 |
|
||
|
Очистка BLOB полей в большой таблице
|
|||
|---|---|---|---|
|
#18+
Alexander Us, Может оказаться, что перелить в новую таблицу с минимальным журналированием будет гораздо эффективнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2019, 14:59 |
|
||
|
Очистка BLOB полей в большой таблице
|
|||
|---|---|---|---|
|
#18+
invmМожет оказаться, что перелить в новую таблицу с минимальным журналированием будет гораздо эффективнее. Переливаю своим тулом на основе SqlBilkCopy, база в Simple Mode. (минимальне журналирование, или?) Проблема в том, что такую переливку приходится выполнять вручную: перелить из BlobTable в BlobTable_NEW, а затем "переключить" таблицы. Недостатки метода: - для переключения старой и новой таблиц приходится выбирать окно с минимальной загрузкой - переключение приходиться выполнять вручную, на мой взгляд овтоматизировать рискованно - старая и новая таблицы, обе лежат в базе и занимают место Что касается reorganize with (lob_compaction = on), много лет назад я пробовал его на SQL 2005, тогда эффекта не было. Но думаю, имеет смысл попробовать ещё раз, на SQL 2008. Хотелось бы конечно иметь возможность освобождать старое BLOB пространство без выведения таблицы в оффлайн и ручных операций. Как Вы думаете, трюк с партиционированием может дать желаемое? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2019, 15:26 |
|
||
|
Очистка BLOB полей в большой таблице
|
|||
|---|---|---|---|
|
#18+
Как насчет варианта вынести блобы в отдельную таблицу? Связь 1 к 1, дальше секционирование этой таблицы, очистку делать с помощью truncate partitions (в sql 2008 switch+trunctate) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2019, 02:47 |
|
||
|
Очистка BLOB полей в большой таблице
|
|||
|---|---|---|---|
|
#18+
А можно вообще в FILESTREAM хранить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2019, 02:50 |
|
||
|
Очистка BLOB полей в большой таблице
|
|||
|---|---|---|---|
|
#18+
RankatanКак насчет варианта вынести блобы в отдельную таблицу? Связь 1 к 1, дальше секционирование этой таблицы, очистку делать с помощью truncate partitions (в sql 2008 switch+trunctate) Удалять надо не стороки, а данные в ячейках таблицы - выборочно. Кроме того, в таблицу постоянно идут вставки, и для switch+trunctate наверное нужно будет определять окна обслуживания - т.е. выводить таблицу в оффлайн. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2019, 10:49 |
|
||
|
Очистка BLOB полей в большой таблице
|
|||
|---|---|---|---|
|
#18+
Relic HunterА можно вообще в FILESTREAM хранить. Можно, но нужно ли: Средняя длинна всех трёх блоб полей 6КБ (есть исключения, поэтому длиння полей установлена в max). А рекомендуемая длинна поля для FILESTREAM от 1МБ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2019, 10:58 |
|
||
|
|

start [/forum/search_topic.php?author=Cranz&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
8ms |
get forum list: |
9ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 691ms |
| total: | 829ms |

| 0 / 0 |
