SQLserver维护

1、查询当前数据库所有用户表的数据总行数

按行数从大到小排序,输出表名 + 记录总数

拆解每张系统表

#sysindexes、sysobjects 是旧版系统视图
SELECT t2.[name],
       rows
FROM   sysindexes t1,
       sysobjects t2
WHERE  t1.id = t2.id
       AND indid < 2
ORDER  BY rows DESC

标准新版替代写法(推荐)

SELECT 
    OBJECT_NAME(p.object_id) AS 表名,
    SUM(p.rows) AS 总行数
FROM sys.partitions p
WHERE p.index_id IN (0,1)
GROUP BY p.object_id
ORDER BY SUM(p.rows) DESC;

完整加过滤优化版(只查用户表)

SELECT t2.[name], t1.rows
FROM sysindexes t1
JOIN sysobjects t2 ON t1.id = t2.id
WHERE t1.indid < 2
  AND t2.xtype = 'U' -- U=用户表,排除系统表S
ORDER BY t1.rows DESC;

2、查询碎片超过 80% 的索引

同时输出表名、碎片率、碎片块数、表数据量、一键重建索引的 DBCC 命令,按碎片严重程度从高到低排序,用于索引碎片清理优化。

SELECT 
OBJECT_NAME(ips.object_id) AS TableName,
avg_fragmentation_in_percent,
ips.fragment_count 碎片数量,
(select max( rows) from sysindexes where id =i.object_id) as 数据条数 ,
'DBCC DBREINDEX('+OBJECT_NAME(ips.object_id)+','+i.name+','+'100)' 重建索引语句,
DB_NAME(database_id) AS DatabaseName
FROM 
    sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) AS ips
JOIN 
    sys.indexes AS i ON ips.object_id = i.object_id AND ips.index_id = i.index_id
	
WHERE 
    avg_fragmentation_in_percent > 80 --碎片大于80%
    AND OBJECTPROPERTY(ips.object_id,'IsUserTable') = 1 -- 过滤只查用户表,移到WHERE内
order by avg_fragmentation_in_percent desc

sysindexes 是废弃视图,新版推荐改用 sys.partitions 取行数

DBCC DBREINDEX 旧语法,官方推荐标准重建语句:

SELECT 
OBJECT_NAME(ips.object_id) AS TableName,
avg_fragmentation_in_percent,
ips.fragment_count AS 碎片数量,
(
    SELECT MAX(p.rows) 
    FROM sys.partitions p 
    WHERE p.object_id = ips.object_id AND p.index_id IN (0,1)
) AS 数据条数,
'ALTER INDEX ' + QUOTENAME(i.name) + ' ON ' + QUOTENAME(OBJECT_NAME(ips.object_id)) + ' REBUILD WITH(FILLFACTOR=100)' AS 重建索引语句,
DB_NAME(database_id) AS DatabaseName
FROM 
    sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) AS ips
JOIN 
    sys.indexes AS i ON ips.object_id = i.object_id AND ips.index_id = i.index_id
WHERE 
    avg_fragmentation_in_percent > 80 --碎片大于80%
    AND OBJECTPROPERTY(ips.object_id,'IsUserTable') = 1 -- 过滤只查用户表,移到WHERE内
ORDER BY avg_fragmentation_in_percent DESC;