[数据库][sqlserver]查看索引碎片
-
SQL 查询部分
-
这段 SQL 查询是从系统动态管理视图
sys.dm_db_index_physical_stats
获取索引碎片化信息。sys.dm_db_index_physical_stats
提供了关于表或索引视图中每个索引的页和行的物理信息。 -
OBJECT_NAME(ips.object_id)
函数用于获取对象(表)的名称。ips.object_id
来自sys.dm_db_index_physical_stats
视图,它标识了表或索引视图的 ID。 -
i.name
是索引的名称,它通过连接sys.indexes
表(连接条件为ips.object_id = i.object_id AND ips.index_id = i.index_id
)来获取。 -
ips.index_type_desc
说明了索引的类型,例如是否是聚集索引、非聚集索引等。 -
ips.avg_fragmentation_in_percent
表示索引的平均碎片率,这是衡量索引物理存储碎片化程度的重要指标。在WHERE
子句中,筛选出碎片率大于 60% 的索引。 -
连接
sys.partitions
表(连接条件为p.object_id = ips.object_id AND p.index_id IN (0, 1)
),其中p.index_id
为 0 表示堆(没有聚集索引的表),1 表示聚集索引,通过SUM(p.rows)
获取表中的行数。 -
查询结果按表的行数(
tablerows
)降序排列,这样可以优先查看行数较多且索引碎片率较高的表。
-
-
索引和统计信息重建部分
-
ALTER INDEX ALL ON STCUSTOMIZE REBUILD WITH (ONLINE = ON)
这句代码用于重建STCUSTOMIZE
表的所有索引,并且指定ONLINE = ON
。在重建索引时,ONLINE = ON
允许在重建索引的过程中,表仍然可以被访问(对于支持的操作)。不过需要注意的是,有些情况下可能无法进行在线重建,例如重建索引时涉及到索引视图等复杂场景可能会有局限性。 -
UPDATE STATISTICS STCUSTOMIZE
用于更新STCUSTOMIZE
表的统计信息。统计信息对于查询优化器来说非常重要,它帮助优化器选择合适的查询执行计划。在重建索引后更新统计信息,可以使查询优化器更好地了解表数据的分布情况,从而生成更高效的执行计划。
-
这些 SQL 语句通常用于数据库的维护操作,目的是优化数据库性能,通过对碎片化严重的索引进行重建和更新统计信息来改善查询效率。不过,在执行这些操作之前,最好备份数据库,因为索引重建等操作可能会对数据库的性能产生短期影响,尤其是在生产环境中。
SELECTOBJECT_NAME(ips.object_id) AS TableName,i.name AS IndexName,ips.index_type_desc,ips.avg_fragmentation_in_percent,SUM(p.rows) AS tablerows
FROMsys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'SAMPLED') ips
JOINsys.indexes i ON ips.object_id = i.object_id AND ips.index_id = i.index_id
JOINsys.partitions p ON p.object_id = ips.object_id AND p.index_id IN (0, 1) -- 关联堆或聚集索引
WHEREips.avg_fragmentation_in_percent > 60
GROUP BYOBJECT_NAME(ips.object_id),i.name,ips.index_type_desc,ips.avg_fragmentation_in_percent
ORDER BYtablerows DESC;-- 重建表的所有索引及统计信息
ALTER INDEX ALL ON STCUSTOMIZE REBUILD WITH (ONLINE = ON);
UPDATE STATISTICS STCUSTOMIZE;