Как известно, информация, в файле базы данных MS SQL сервера хранится в таблицах, а они в свою очередь, в страницах и экстентах. Это чем-то напоминает файловую структуру. Фактически, в какой-то степени, так оно и есть. И как и обычная файловая структура, логическая структура базы данных подвержена такому явлению, как фрагментация, что влечет за собой рост объема занимаемого пространства и некоторое снижение скорости работы.
Вследствие архитектуры MS SQL сервера, важное значение имеет быстрота доступа к индексу, и поэтому, начиная с версии 8.0 (MS SQL 2000) для индексов существует встроенное средство дефрагментации - команда "DBCC INDEXDEFRAG ". Эта команда позволяет дефрагментировать каждый индекс в отдельности, и ее основная особенность в том, что процесс дефрагментации происходит одновременно с работой пользователей, совсем не влияя на нее, так как не происходит изменения данных, а происходит изменение их места расположения. В отличие от описанной ранее процедуры переиндексации, которая должна делаться в нерабочее время, дефрагментация может совершенно безболезненно делаться в рабочее время. Разумеется, в этот момент нагрузка на дисковую подсистему и процессор, значительно возрастает, и этот факт надо учитывать в высоконагруженных системах.
Еще один плюс от дефрагментации индексов, кроме увеличение скорости поиска в них - это уменьшение занимаемого места, путем изменения заполнения страниц (как правило в стандартно настроенной базе данных стоит опция 100% заполнения). После процедуры дефрагментации можно сделать сжатие базы, как описано здесь, и увидеть, что ее объем несколько уменьшился. Величина уменьшения зависит от того, насколько часто проводилась перестройка либо дефрагментация индексов.
Итак, чтобы произвести дефрагментацию, нужно открыть QA (Query Analyzer)
, выбрать в нем нужную базу данных и запустить следующий скрипт:
DECLARE @MyTable varchar(32) DECLARE @MyIndex varchar(32) DECLARE MyCursor CURSOR FOR SELECT o. name, i. name FROM sysobjects o INNER JOIN sysindexes i ON o. id = i. id WHERE (o.xtype = 'U' ) AND ( INDEXPROPERTY (i. id, i. name, 'isStatistics' ) = 0) AND (i.dpages > 0) ORDER BY o. name, i. indid OPEN MyCursor FETCH NEXT FROM MyCursor INTO @MyTable, @MyIndex WHILE @@FETCH_STATUS =0 BEGIN PRINT 'Дефрагментация индекса ' +@MyIndex+ ' из таблицы ' +@MyTable DBCC INDEXDEFRAG (0,@MyTable,@MyIndex) FETCH NEXT FROM MyCursor INTO @MyTable, @MyIndex END CLOSE MyCursor DEALLOCATE MyCursor
Во время работы скрипт показывает, с каким индексом какой таблицы он работает. После окончания работы выводиться информация о количестве перемещенных и очищенных страниц.
Перепечатка, воспроизведение в любой форме, распространение, в том числе в переводе, любых материалов с сайта www.softpoint.ru возможны только с письменного разрешения компании "СофтПоинт". Это правило действует для всех без исключения случаев, кроме тех, когда в материале прямо указано разрешение на копирование (основание: Закон Российской Федерации "Об авторском праве и смежных правах").
|