Дефрагментация индексов в базе данных MS-SQL 2000   

   

Как известно, информация, в файле базы данных 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 возможны только с письменного разрешения компании "СофтПоинт". Это правило действует для всех без исключения случаев, кроме тех, когда в материале прямо указано разрешение на копирование (основание: Закон Российской Федерации "Об авторском праве и смежных правах").

Статья: Дефрагментация индексов в базе данных MS-SQL 2000

Перейти на главную страницу компании "Софтпоинт"