Saya menggunakan skrip ini. Harap dicatat saya akan menyarankan Anda membaca tentang dmv yang saya gunakan di sini mereka adalah permata tersembunyi di SQL2005+.
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
CREATE TABLE #FragmentedIndexes
(
DatabaseName SYSNAME
, SchemaName SYSNAME
, TableName SYSNAME
, IndexName SYSNAME
, [Fragmentation%] FLOAT
)
INSERT INTO #FragmentedIndexes
SELECT
DB_NAME(DB_ID()) AS DatabaseName
, ss.name AS SchemaName
, OBJECT_NAME (s.object_id) AS TableName
, i.name AS IndexName
, s.avg_fragmentation_in_percent AS [Fragmentation%]
FROM sys.dm_db_index_physical_stats(db_id(),NULL, NULL, NULL, 'SAMPLED') s
INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id]
AND s.index_id = i.index_id
INNER JOIN sys.objects o ON s.object_id = o.object_id
INNER JOIN sys.schemas ss ON ss.[schema_id] = o.[schema_id]
WHERE s.database_id = DB_ID()
AND i.index_id != 0
AND s.record_count > 0
AND o.is_ms_shipped = 0
DECLARE @RebuildIndexesSQL NVARCHAR(MAX)
SET @RebuildIndexesSQL = ''
SELECT
@RebuildIndexesSQL = @RebuildIndexesSQL +
CASE
WHEN [Fragmentation%] > 30
THEN CHAR(10) + 'ALTER INDEX ' + QUOTENAME(IndexName) + ' ON '
+ QUOTENAME(SchemaName) + '.'
+ QUOTENAME(TableName) + ' REBUILD;'
WHEN [Fragmentation%] > 10
THEN CHAR(10) + 'ALTER INDEX ' + QUOTENAME(IndexName) + ' ON '
+ QUOTENAME(SchemaName) + '.'
+ QUOTENAME(TableName) + ' REORGANIZE;'
END
FROM #FragmentedIndexes
WHERE [Fragmentation%] > 10
DECLARE @StartOffset INT
DECLARE @Length INT
SET @StartOffset = 0
SET @Length = 4000
WHILE (@StartOffset < LEN(@RebuildIndexesSQL))
BEGIN
PRINT SUBSTRING(@RebuildIndexesSQL, @StartOffset, @Length)
SET @StartOffset = @StartOffset + @Length
END
PRINT SUBSTRING(@RebuildIndexesSQL, @StartOffset, @Length)
EXECUTE sp_executesql @RebuildIndexesSQL
DROP TABLE #FragmentedIndexes
Juga perlu diingat bahwa skrip ini dapat berjalan beberapa saat dan memblokir akses ke tabel Anda. Kecuali Anda memiliki edisi Enterprise, SQL dapat MENGUNCI tabel saat membangun kembali indeks. Ini akan memblokir semua kueri ke tabel itu menggunakan indeks hingga defrag indeks selesai. Oleh karena itu, tidak disarankan untuk menjalankan pembangunan kembali indeks selama jam operasional hanya selama periode pemeliharaan. Jika Anda menjalankan edisi perusahaan, Anda dapat menggunakan opsi ONLINE=ON untuk mendefrag indeks secara online. Ini akan menggunakan lebih banyak ruang tetapi tabel Anda tidak akan diblokir/dikunci selama operasi defrag.
Berteriaklah jika Anda membutuhkan informasi lebih lanjut.
DIPERBARUI:
Jika Anda menjalankan kueri ini pada database yang lebih kecil, Anda mungkin dapat menggunakan parameter 'DETAILED' dalam panggilan ke sys.dm_db_index_physical_stats. Ini mungkin pemeriksaan indeks yang lebih rinci. Diskusi di komentar juga akan menunjukkan bahwa pada tabel yang jauh lebih besar mungkin layak dilakukan pemindaian SAMPLED karena ini akan membantu mengurangi waktu yang dibutuhkan untuk melakukan pemindaian indeks.