Я знаю, что на самом деле есть три вида фрагментации, о которых я должен беспокоиться как администратор баз данных:
Фрагментация индекса в файлах данных SQL, включая фрагментацию кластерного индекса (таблицы). Определите это с помощью DBCC SHOWCONTIG (в SQL 2000) или sys.dm_ db_ index_ Physical_Stats (в 2005+).
Фрагментация VLF внутри файлов журнала SQL. Запустите DBCC LOGINFO, чтобы увидеть, сколько VLF содержится в каждом из ваших файлов журнала SQL.
Физическая фрагментация файлов базы данных на жестком диске. Диагностируйте это с помощью утилиты «Дефрагментация диска» в Windows. (вдохновленный этим прекрасным сообщением в блоге )
Большое внимание уделяется фрагментации индекса (см. Этот отличный ответ Serverfault от Пола Рэндалла), так что это не главное в моем вопросе.
Я знаю, что могу предотвратить физическую фрагментацию (и фрагментацию VLF), когда база данных изначально создается, планируя разумный ожидаемый размер файла данных и журнала, потому что эта фрагментация чаще всего возникает из-за частых увеличений и уменьшений, но у меня есть несколько вопросов о том, как исправить физическая фрагментация, как только она идентифицирована:
Прежде всего, актуальна ли физическая фрагментация в Enterprise SAN? Могу ли я / я должен использовать дефрагментацию Windows на диске SAN, или команда SAN использует внутренние утилиты дефрагментации? Является ли анализ фрагментации, который я получаю от инструмента Windows, даже точным при запуске на диске SAN?
Насколько велика физическая фрагментация производительности SQL? (Давайте предположим, что внутренний дисковый массив ожидает решения предыдущего вопроса.) Является ли это более крупной сделкой, чем внутренняя фрагментация индекса? Или это действительно та же самая проблема (привод должен делать случайное чтение вместо последовательного чтения)
Является ли дефрагментация (или перестройка) индексов пустой тратой времени, если диск физически фрагментирован? Должен ли я исправить один, прежде чем обратиться к другому?
Каков наилучший способ исправить физическую фрагментацию файлов в рабочей коробке SQL? Я знаю, что могу отключить службы SQL и запустить дефрагментацию Windows, но я также слышал о методике, когда вы делаете полное резервное копирование, удаляете базу данных, а затем восстанавливаете ее из пустого диска. Этот последний метод рекомендуется? Есть ли восстановление из резервной копии , как это также создавать индексы с нуля, устранение внутренней фрагментации индекса? Или он просто возвращает порядок страниц на тот же, что и при создании резервной копии? (Мы используем резервные копии Quest Lightspeed со сжатием, если это имеет значение.)
ОБНОВЛЕНИЕ : Хорошие ответы на данный момент о том, следует ли дефрагментировать диски SAN (НЕТ) и стоит ли дефрагментация индекса на физически фрагментированных дисках (ДА).
Кто-нибудь еще хочет взвесить лучшие методы для проведения дефрагментации? Или оценка времени, которое, как вы ожидаете, потребуется для дефрагментации большого фрагментированного диска, скажем, 500 ГБ или около того? Очевидно, потому что это время, когда мой SQL-сервер не работает!
Кроме того, если у кого-нибудь есть какая-либо неподтвержденная информация об улучшениях производительности SQL, которые вы сделали, исправив физическую фрагментацию, это тоже было бы здорово. В блоге Майка рассказывается о том, как раскрыть проблему, но не говорится о том, какие улучшения она сделала.