回答

收藏

根据碎片结果自动进行INDEX重建?

技术问答 技术问答 455 人阅读 | 0 人回复 | 2023-09-14

检查索引碎片是否可以添加维护操作。如果大于50%,那些索引自动重建?6 @1 h! v& ~8 a, n7 y7 L1 ?' W7 e; d7 u
索引的大小可以从1000开始MB到10GB不等。SQL 2005。
5 n( m0 C1 R+ p- u+ |5 X6 R4 N( r谢谢你。
. ~4 A* t* B( b+ t8 R1 r; A                                                               
* L1 U' N  Z2 z& b6 \4 j: ]7 Q: b    解决方案:                                                               
8 Z5 [5 b  a9 k* H( I+ `                                                                我用这个脚本。请注意,我建议你阅读我在这里使用的相关内容。dmv信息,他们是SQL2005  隐藏宝石。
# @. m# [& q' N2 q! ]SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDCREATE TABLE #FragmentedIndexes( DatabaseName SYSNAME ,SchemaName SYSNAME ,TableName SYSNAME ,IndexName SYSNAME ,[Fragmentation%] FLOAT)INSERT INTO #FragmentedIndexesSELECT 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') sINNER JOIN sys.indexes i ON s.[object_id] = i.[object_id]AND s.index_id = i.index_idINNER JOIN sys.objects o ON s.object_id = o.object_idINNER JOIN sys.schemas ss ON ss.[schema_id] = o.[schema_id]WHERE s.database_id = DB_ID()AND i.index_id != 0AND s.record_count > 0AND o.is_ms_shipped = 0DECLARE @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;'ENDFROM #FragmentedIndexesWHERE [Fragmentation%] > 10DECLARE @StartOffset INTDECLARE @Length INTSET @StartOffset = 0SET @Length = 4000WHILE (@StartOffset 请记住,此脚本可能会运行一段时间,并防止对表的访问。重建索引时,除非您有企业版,否则SQL可以锁定表。这将使用索引来阻止所有查询表,直到索引碎片完成。因此,不建议仅在维护期内的工作时间内进行索引重建。如果您正在运行企业版本,您可以使用它ONLINE
3 p/ e* m- j8 I9 Q= ON选项在线整理索引的碎片。这将使用更多的空间,但在整理碎片时不会阻止/锁定您的表。4 i: E4 d- G& Q" L- Z# v( E
如果您需要更多信息,请喊。
7 x: z1 X5 `: v1 |2 F3 b更新:6 D! I6 @: \- _2 x9 g0 U4 }9 I
如果此查询运行在较小的数据库上,则可以在sys.dm_db_index_physical_stats使用调用
, O4 {6 r$ `1 I) b+ I2 X  }DETAILED参数。这可能是对索引的更详细的检查。评论中的讨论还将指出,它可能值得更大的表格SAMPLED扫描,因为减少索引扫描所需的时间。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则