четверг, 22 апреля 2010 г.

Rebuild All Index in Database Sql Server – 2005 - 2008 with FillFactor

Так складывется, что основная моя работа не связана с тонкой настройкой базы данных и даже в некотором смысле это не самое мое сильное место в информационных технологиях. Но самые интересные для меня вопросы попадаются из сферы баз данных и СУБД.
Сегодня рассмотрим несложный SQL скрипт для перестройки всех индексов в базе данных:
USE DatabaseName
GO
 
DECLARE @fillFactor int
 
-- configuration set fillfactor for indexes
SET    @fillFactor = 90
 
DECLARE @dbTables TABLE
(
ID INT IDENTITY(1,1) NOT NULL,
TABLE_NAME VARCHAR(128) NOT NULL
)
 
INSERT INTO @dbTables
SELECT OBJECT_SCHEMA_NAME([object_id])+'.'+name FROM sys.tables
WHERE type_desc = 'USER_TABLE'
 
DECLARE @tableCount int
DECLARE @tableName VARCHAR(128)
DECLARE @sql VARCHAR(200)
 
SELECT @tableCount = COUNT(*) FROM @dbTables
 
WHILE (@tableCount>0)
BEGIN
SELECT TOP 1 @tableName = TABLE_NAME from @dbTables
 
SET @sql = 'ALTER INDEX ALL ON ' + @tableName + ' REBUILD WITH (FILLFACTOR = ' + CONVERT(VARCHAR(3),@fillFactor) + ')'
PRINT @sql
EXEC(@sql)
DELETE FROM @dbTables
WHERE id=(SELECT TOP 1 ID FROM @dbTables)
SET @tableCount=@tableCount-1
END
 
--fix some configuration issue
/*
sp_configure 'show advanced options', 1
GO
RECONFIGURE WITH OVERRIDE
GO
sp_configure 'fill factor', 90
GO
RECONFIGURE WITH OVERRIDE
GO 
*/
 
Иногда происходит ошибка описанная Pinal Dave для ее решения можно использовать закомментированный T-SQL код.
Естественно что использовать данную процедуру необходимо производить осторожно, так как это вызывает дополнительную (иногда не слабую) нагрузку на сервер. Также иногда необходима тонкая настройка индексов с учетом FILLFACTOR, DATA_COMPRESSION, etc.

SQL скрипт - Rebuild All Index in Database 2005-2008