Я знаю, що є насправді три види фрагментації, про які мені потрібно потурбуватись як DBA:
Фрагментація індексу у файлах даних SQL, включаючи кластеризовану фрагментацію індексу (таблиці). Визначте це за допомогою DBCC SHOWCONTIG (у SQL 2000) або sys.dm_ db_ index_ physical stats (у 2005+).
Фрагментація VLF всередині файлів журналу SQL. Запустіть DBCC LOGINFO, щоб побачити, скільки VLF є у кожному з ваших файлів журналу SQL.
Фізична фрагментація файлів бази даних на жорсткому диску. Діагностуйте це за допомогою утиліти "Дефрагментатор диска" у Windows. (натхненний цією чудовою публікацією в блозі )
Багато уваги приділяється фрагментації індексу (див. Цю чудову відповідь сервера за замовчуванням від Пола Рендала), тож це не фокус мого питання.
Я знаю, що я можу запобігти фізичній фрагментації (та фрагментації VLF), коли база даних спочатку створюється шляхом планування розумного очікуваного розміру файлу даних та розміру журналу, оскільки ця фрагментація виникає найчастіше із частого зростання та скорочення, але у мене є деякі питання, як виправити фізична роздробленість після її виявлення:
Перш за все, чи є фізична фрагментація навіть актуальною для Enterprise SAN? Чи можу я / чи слід використовувати дефрагментатор Windows на накопичувачі SAN, чи команда SAN повинна використовувати внутрішні утиліти дефрагментації? Чи точний аналіз фрагментації, який я отримую від інструмента Windows, навіть точний під час роботи на накопичувачі SAN?
Наскільки велика угода - фізична фрагментація продуктивності SQL? (Припустимо, внутрішній масив приводу, до очікування результату попереднього запитання.) Це БІЛЬШЕ угода, ніж внутрішня фрагментація індексу? Або це справді така ж проблема (накопичувач повинен робити випадкові читання замість послідовних читання)
Чи є маркуванням часу дефрагментація (або перебудова) індексів, якщо привід фізично фрагментований? Чи потрібно виправити одне, перш ніж звертатись до іншого?
Який найкращий спосіб виправити фрагментацію фізичних файлів у виробничому SQL-коді? Я знаю, що можу вимкнути сервіси SQL та запустити Windows Defrag, але я також чув про техніку, коли ви робите повну резервну копію, скидаєте базу даних, а потім відновите з резервної копії на порожній диск. Чи рекомендується ця остання техніка? Чи відновлення такої резервної копії також створює індекси з нуля, виключаючи внутрішню фрагментацію індексу? Або просто повертає порядок сторінки таким же, як і коли було зроблено резервну копію? (Ми використовуємо резервні копії Quest Lightspeed із стисненням, якщо це має значення.)
ОНОВЛЕННЯ : На сьогоднішній день хороші відповіді щодо того, чи слід дефрагментувати SAN-накопичувачі (НІ) та чи дефрагментація індексу досі стоїть на фізично фрагментованих накопичувачах (ТАК).
Хтось ще хотів би зважити на найкращі методи для фактичного проведення дефрагментації? Або підрахунок часу, який ви очікуєте, що знадобиться для дефрагментації великого роздробленого накопичувача, скажімо, 500 Гб або близько того? Відповідно, очевидно, тому що саме в цей час мій сервер SQL знищиться!
Крім того, якщо у когось є якась анекдотична інформація про покращення продуктивності SQL, яку ви зробили, виправляючи фізичну фрагментацію, це теж було б чудово. Повідомлення в блозі Майка розповідає про розкриття проблеми, але не конкретно про те, яке саме поліпшення воно зробило.