Skip to content

文章

SQL Azure 中的索引碎片,谁知道呢!

2015年4月26日 • 3 分钟阅读

SQL Azure 中的索引碎片,谁知道呢!

我在我的项目上工作了一年多,在这一年中,它作为一个应用程序和数据都有了显著的增长。一直在不停地开发新功能。我很少回头重构代码。上周我注意到一些数据量大的页面加载缓慢。在最坏的情况下,一个视图可能需要30秒才能加载。比我的最大加载时间慢了10倍…

说我天真也好,但我没有考虑过 SQL Azure 中的索引碎片问题。这是云!它应该对本地问题免疫…显然索引碎片在云中也是一个问题。

我在 MSDN 博客上找到了几个查询,可以识别碎片化的索引然后重建它们。

运行第一个查询显示索引碎片后,我发现一些索引的碎片率超过50%。根据文章,任何超过10%的都需要注意。

第一个查询显示索引碎片

--Get the fragmentation percentage

SELECT
 DB_NAME() AS DBName
,OBJECT_NAME(ps.object_id) AS TableName
,i.name AS IndexName
,ips.index_type_desc
,ips.avg_fragmentation_in_percent
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.indexes i
ON ps.object_id = i.object_id
AND ps.index_id = i.index_id
CROSS APPLY sys.dm_db_index_physical_stats(DB_ID(), ps.object_id, ps.index_id, null, 'LIMITED') ips
ORDER BY ps.object_id, ps.index_id

第二个查询重建索引

--Rebuild the indexes
DECLARE @TableName varchar(255)

DECLARE TableCursor CURSOR FOR
(
 SELECT '[' + IST.TABLE_SCHEMA + '].[' + IST.TABLE_NAME + ']' AS [TableName]
 FROM INFORMATION_SCHEMA.TABLES IST
 WHERE IST.TABLE_TYPE = 'BASE TABLE'
 )

 OPEN TableCursor
 FETCH NEXT FROM TableCursor INTO @TableName
WHILE @@FETCH_STATUS = 0

 BEGIN
 PRINT('Rebuilding Indexes on ' + @TableName)
Begin Try
 EXEC('ALTER INDEX ALL ON ' + @TableName + ' REBUILD with (ONLINE=ON)')
End Try
Begin Catch
 PRINT('Cannot do rebuild with Online=On option, taking table ' + @TableName+' down for douing rebuild')
 EXEC('ALTER INDEX ALL ON ' + @TableName + ' REBUILD')
 End Catch
FETCH NEXT FROM TableCursor INTO @TableName
END

CLOSE TableCursor
DEALLOCATE TableCursor

来源

作者:Chuck Conway 专注于软件工程和生成式人工智能。在社交媒体上与他联系:X (@chuckconway) 或访问他的 YouTube

↑ 回到顶部

您可能还喜欢