Найкращий спосіб дефрагментації / компактної бази даних для архівних цілей


9

У нас є екземпляр SQL Server, який використовується для архівації електронної пошти (надано стороннім пакетом архівування). Кожне так часто програмне забезпечення перекидається на нову порожню базу даних. Ми це робили щокварталу, але ми хочемо робити це щомісяця. Обсяг даних, що архівуються, становить приблизно 15 - 20 ГБ на місяць, а основна частина даних розміщується лише у кількох таблицях (зазвичай це 2 - 4).

Як тільки ми переходимо до нової бази даних, стара застосовується на суворій основі для читання. Що я хотів би зробити, це оптимізувати його в хороший, чіткий файл даних, при цьому всі таблиці / індекси є суміжними і мають дуже високий коефіцієнт заповнення, і не так багато порожнього місця в кінці файлу даних. Крім того, ми використовуємо Standard Edition на цьому сервері з усіма обмеженнями, що випливають (інакше я б уже використовував стиснення даних).

Я можу придумати кілька можливостей:

  1. Індекси REBUILD / REORGANIZE, DBCC SHRINKFILE (Гаразд, це не розумний варіант, оскільки DBCC SHRINKFILE буде фрагментувати мозку від усього, до чого вона торкнеться, але я включаю це для повноти.)
  2. Створіть нову базу даних із відключеною автоматичною статистикою. Сценарій та відтворення всіх таблиць із вихідної бази даних. Використовуйте bcp для експорту / імпорту даних у нову базу даних в порядку кластерного ключа. Сценарій і відтворення всіх індексів. Перерахуйте всю статистику за допомогою повного сканування.
  3. Створіть нову базу даних із відключеною автоматичною статистикою. Сценарій та відтворення всіх таблиць із вихідної бази даних. Використовуйте SSIS або T-SQL для передачі даних у нову базу даних. Сценарій і відтворення всіх індексів. Перерахуйте всю статистику за допомогою повного сканування.

Останнім кроком у кожному випадку буде встановлення бази даних в режим лише для читання.

Які ще хороші / кращі варіанти є для цього? Моє занепокоєння полягає в тому, щоб перенести дані таким чином, щоб зберегти високий коефіцієнт заповнення та логічно суміжним способом.

Редагувати:

Слід зазначити, що, як видається, близько 75% даних зберігається у графі (LOB).


3
Чи дбаєте ви (або додаток), якщо таблиці фізично потрапляють у групу файлів, окрім PRIMARY?
Джон Сейгель

@JonSeigel Я гадаю, що ні, і насправді це досить гарна ідея, оскільки це врятує мені проблеми створити базу даних шаблонів і перемістити всі дані.
db2

Чи розглядаєте ви лише ті рішення, які ви кодуєте самі, або можете також переглянути якусь програму, яка допоможе вам у цьому? Ви можете використовувати SQL Storage Compress RedGate для стиснення живих даних. Або ви можете спробувати Virtual Restore, щоб зробити стислі резервні копії доступними як онлайн-dbs (не маючи фактично повного простору). Всі вони базуються на старих драйверах файлів Windows Hyperbac, які дуже добре стискають дані та резервні копії.
Маріан

@Marian Звучить цікаво, але я зараз хотів би дотримуватися нативних можливостей SQL Server. Мені просто потрібно дуже ефективно дефрагментацію баз даних, без усього файлу, що не використовується, у файлі. Якщо це сторонній інструмент, який виконує роботу замість сценаріїв вручну, це добре.
db2

Це просто думка, але чому б не створити нову файлову групу, додати файл, встановити розумний ріст (скажімо, 500 Мб), а потім відновити свої таблиці в цю нову файлову групу. Потім скорочуйте первинний файл майже до нічого. Вам не буде байдуже лишатись про фрагментацію системних таблиць.
Nic

Відповіді:


1

Для усунення фізичної фрагментації у файлах ви можете перемістити кластерний індекс із краплею існуючої у нову групу файлів. Оскільки вони будуть RO, вони зроблять їх усім наповнювачем на 100%, оскільки не потрібно місця для вставок, розбиття сторінок, викликане оновленнями.

Це також дозволить вам відновити поодиноку частину і дуже швидко вивести базу даних в Інтернет, якщо ви вирішили коли-небудь перейти в Enterprise. Підприємство також дозволяє індекси магазинного стовпця, крім того, що значно скорочують час запитів для цих даних лише для читання, що є масивним філе.

Ви можете скористатися параметром термоусадочного файлу один раз перед переключенням на читання лише без серйозних проблем з фрагментацією, щоб видалити простір в кінці файлу за вашим бажанням.

З іншого боку, просто перевіряйте, чи використовуєте ви останні дані типу для своїх LOBS. тобто nvarchar (max) або varchar (max) замість ntext або text, varbinary (max) замість зображення?


На жаль, в основному використовується текст і зображення, на жаль. Це стороннє додаток, тому я не маю можливості це змінити.
db2

@ досить прозоро для програми, і SQL-сервер зберігає інформацію в рядку, якщо <8k. Якщо продавець каже, що це не підтримується, я б запитав їх, чому вони все ще використовують типи даних, спочатку застарілі в SQL Server 2005!
ПошкодженіGoods

Я не можу бути повністю впевненим, що програма не робить текстових / зображувальних матеріалів, таких як WRITETEXT, які не зможуть змінити тип даних. Але повернемось до основної суті, схоже, що відтворення кластерного індексу насправді не перемістить з ним дані LOB.
db2

ви можете це зробити, але вам потрібно зайти в дизайнер у графічному інтерфейсі, потім розгорнути властивості, тоді у вас є "звичайний простір даних", а також група файлів TEXTIMAGE, змінивши цю волю, але будьте обережні, це відтворить таблицю! ви, очевидно, можете це сценарій і запустити у вікні технічного обслуговування, якщо можливо
DamagedGoods

Зрозуміло, що це може бути корисним способом для створення відповідних сценаріїв відновлення принаймні.
db2

0

Я зіткнувся з подібною проблемою з стороннім інструментом, який також використовував тип даних зображення для зберігання неструктурованих даних, і я вирішив це шляхом перетворення стовпця для використання потоку файлів . Вам потрібно буде зробити тестування, щоб переконатися, що додаток все ще функціонує так, як ви очікували, але це дасть вам можливість написати власний процес архівації, який ефективно переміщує ваші дані до архіву DB.


Я підозрюю, що файловий потік в цьому випадку не зміг би масштабуватися. У нас є понад 14 мільйонів рядків у 17 базах даних, і ми отримуємо повідомлення приблизно в 15 000 на день. Значна частина тел повідомлень становить менше 4 Кб, тому відходи кластерів NTFS, ймовірно, будуть брутальними (і це навіть якщо ми додамо новий об'єм диска розміром блоку менше 64 КБ).
db2

У такому випадку ви можете перетворити тип даних у щось на кшталт nvarchar (max) і скористатись пунктом TEXTIMAGE_ON, щоб вказати іншу групу файлів для цих великих об'єктів? Це дозволить вам зберігати дані поза рядком і дозволить створити власний процес управління архівацією.
Ліам Конфрі

використання потоку файлів дійсно залежить від того, наскільки велика кожна LOBS. Я думаю> 1 Мб на запис, який слід врахувати. Тож я погодився б у цьому випадку це не варіант
DamagedGoods
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.