У мене є кілька таблиць із кількістю рядків між 5М та 1.5G
У кожній таблиці є поле BLOB, розмір якого змінюється від 100 байт до 30 Мбайт і яке зберігається як "великі типи значень поза рядом" = УВІМКНЕНО
Таблиці зберігаються в різних групах файлів з 3-4 файлами кожен на різному диску @ різні LUNs @ дуже швидкий SAN
Щодня ці таблиці виростають на 5-100 Гбіт розміром і 600 к - 1,5 М рядків
Через певний проміжок часу , який коливається від 2 тижнів до 6 місяців, деякі рядки видаляються або переміщуються в архівну БД, тому - у робочих таблицях, старших 6 місяців, немає рядків.
Поточна конфігурація сервера:
- Двигуном SQL-сервера є 2008 R2 SP1 Enterprise @ 24 ядра, 64 Гб оперативної пам’яті
- SQL Server працює з додатковими прапорами запуску:
-T 3640; (Виключає надсилання DONE_IN_PROC повідомлень клієнтові для кожного оператора у збереженій процедурі. Це схоже на налаштування сеансу SET NOCOUNT ON, але якщо встановлено як прапор сліду, кожен сеанс клієнта обробляється таким чином)
-T 1118; (Перемикає розподіли в tempDB від 1pg за один раз (для перших 8 сторінок) в одній мірі.)
-T 2301; (Дозволяє розширені оптимізації, характерні для запитів підтримки прийняття рішень. Цей параметр застосовується для обробки підтримки великих рішень наборів даних)
-T 1117; (Зростає всі файли даних одночасно, інакше це відбувається по черзі.)
-Е; (Збільшує кількість розширень, що виділяються для кожного файлу у групі файлів. Ця опція може бути корисною для програм сховища даних, у яких обмежена кількість користувачів працює з індексом або скануванням даних)
-T 834; (Викликає SQL Server використовувати виділення на великих сторінках Windows для пам'яті, виділеної для буферного пулу, http://msdn2.microsoft.com/en-us/library/aa366720.aspx , http://support.microsoft. com / kb / 920093 )
- SQL Server використовує великі розширення сторінок
- SQL Server використовує швидку опцію ініціалізації файлів
- AUTOSHRINK ВИМКНЕНО для всіх баз даних
Проблема полягає в тому, що, починаючи з деякого часу роботи сервера (від пари днів до місяців) GHOST CLEANUP
процес відмовляється працювати з примусовим очищенням і просто виконує свою звичайну роботу - очищає кілька сторінок за кілька секунд ( which is seen thru Extended Events
), що не підходить , оскільки він не в змозі очистити всі видалені рядки
Проблема зберігається з часів SQL Server 2005 RTM Enterprise
Як мене намагалися вирішити:
- Спробував змусити операції SCAN на кластерних індексах таблиць
- Спробував змусити операції SCAN, які включали весь вміст стовпця BLOB на кластерних індексах таблиць
- система sp_clean_db_free_space & sp_clean_db_file_free_space
- вручну очищення dbcc (@dbid, @fileid, @page) для всіх файлів та сторінок у БД
- відновлення та реорганізація кластерних індексів
- відтворення бази даних
DBCC FORCEGHOSTCLEANUP
Коли я запускаю запит:
select * from sys.dm_db_index_physical_stats(db_id(), object_id('ProblemTable'), 1, 0, 'detailed')
Я бачу мільйони і десятки мільйонів записів привидів, але лише для типу одиниці виділення LOB_DATA
Єдині речі, які допомагають:
- зупинка сервера за допомогою команди SHUTDOWN або перезавантаження всього хоста - це допомагає після перезапуску процесу GHOST CLEANUP запустити кілька годин і фактично очистити всі прибрані записи
- DBCC SHRINKFILE з опцією EMPTYFILE - переміщення всіх даних з одного файлу в інший або новостворені файли очищує записи привидів лише в цьому файлі - проблема полягає в тому, що я дуже ненавиджу операції скорочення. І це займе 3-4 дні для одного файлу
питання - чи існує будь-який програмний (бажаний) або спосіб обслуговування, щоб змусити GHOST CLEANUP взагалі без простоїв сервера, оскільки простої сервера коштують занадто багато, навіть неприйнятно - його від тисяч до десятків тисяч доларів на годину
Проблеми, які були помічені, мої тут:
- http://support.microsoft.com/kb/932115
- http://www.sqlservercentral.com/Forums/Topic496244-149-1.aspx
І саме те саме тут: