Обслуговування індексів і статистик ms sql server

Обслуговування індексів і статистик MS SQL Server

Індекси і статистики в MS SQL Server - основа ефективного виконання запитів. Без них сервер не зможе виконувати запити за розумний час.

Статистика - невелика таблиця, до 200 рядків, в якій зберігається узагальнена інформація про те, які значення і як часто зустрічаються в таблиці. На підставі статистики сервер приймає рішення, який індекс використовувати при виконанні запиту.

Індекс - особливим чином структуровані дані (що зберігаються в базі даних), які дозволяють швидко знайти потрібні записи. Влаштований він приблизно так, як зміст в книзі або предметний покажчик. Більшість баз даних 1С за обсягом більш ніж наполовину складаються з індексів. Для кожного індексу обов'язково зберігається його статистика.

За подробицями внутрішнього устрою, як зазвичай відсилаю в BOL:

В цілому MS SQL Server сам справляється з підтримкою цілісності і ефективності статистик і індексів, але якщо ніяк йому не допомагати, то поступово накопичуються такі проблеми:

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

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

Варто врахувати, що 1C для полегшення переносимості архітектури між різними видами СУБД використовує лише невелику частину сучасних можливостей індексування MS SQL Server. За рахунок цього обслуговування індексів і статистик кілька спрощується.

Отже, що таке це "обслуговування"? Все просто.

Для обслуговування є спеціальні "цеглинки" в планах обслуговування (maitenance plan), які так і називаються:

  • Update Statistics Task
  • Rebuild Index Task
  • Reorganize Index Task

Здавалося б все просто: накидав цеглинок, з'єднав стрілочкою і поїхали. Таке рішення можливе, але воно дуже неефективно:

  1. Індекси перебудовуються / реорганізуються тільки все відразу в даній базі. Тобто навіть якщо таблиця ніколи не змінюється, її індекси будуть перебудовуватися. Це дуже марнотратно, а при повній моделі відновлення ще і призводить до величезного зростання журналів транзакцій.
  2. Статистики теж перебудовуються незалежно від актуальності, причому навіть якщо вони були тільки що оновлені при перестроюванні індексів.
  3. Немає ніяких гарантій, що операція обслуговування завершиться за той час, який ви їй виділили.

З чим потрібно бути обережним при запуску скрипта:

Рекомендації по запуску:

PS: Движок сайту некоректно отобажает текст зі знаками більше-менше, тому скрипт прикладений файлом, а в статті залишено тільки початок скрипта.