文章目录
- 前言
- 索引相关操作
- 1 、查看全部索引信息
- 2 、重建所有表索引
- 3 、查看某个表索引信息
- 4 、重建某个表索引
- 查询索引字段说明
- 执行修复索引字段
前言
这几天被一个项目搞得烦死了,客户老是反馈后台查询前一天注册的用户数据失败,看了错误日志,请求超时,数据库查不出来数据
把错误sql拿去服务器上直接执行,发现花了1分钟左右才出结果
然后找了半天,也没发现问题,最后把用户创建时间这个字段的索引删除,重新建了一个,发现好了。
但是第三天,客户查询第二天的数据的时候发现有查不出来了,发现索引还在,但是他只有时间条件查询我创建索引前的时间才很快,创建后的数据好像没有加索引。
查了半天没啥结果,向华为云(用的华为云rds)提工单询问也没啥结果。
最后,我们老板说之前他好像遇到过这个问题,给了一个存储过程,修复所有索引,发现确实可以查出来了。
但是不是很清楚这个修复索引的存储过程和我删了索引重新建有啥区别。
反正现在写了一个线程,每天5.30执行那个存储过程,修复索引……
索引相关操作
1 、查看全部索引信息
DBCC SHOWCONTIG WITH TABLERESULTS, ALL_INDEXES
2 、重建所有表索引
Go
DECLARE @DBCCString NVARCHAR(1000)
DECLARE @TableName VARCHAR(100)
DECLARE Cur_Index CURSOR
FOR
SELECT Name AS TblName
FROM sysobjects
WHERE xType=‘U’
ORDER BY TblName
FOR READ ONLY
OPEN Cur_Index
FETCH NEXT FROM Cur_Index
INTO @TableName
WHILE @@FETCH_STATUS=0
BEGIN
SET @DBCCString = ‘DBCC DBREINDEX(@TblName,’‘’‘)WITH NO_INFOMSGS’
EXEC SP_EXECUTESQL @DBCCString,N’@TblName VARCHAR(100)', @TableName
PRINT ‘重建表’ + @TableName +‘的索引…OK!’
FETCH NEXT FROM Cur_Index INTO @TableName
END
CLOSE Cur_Index
DEALLOCATE Cur_Index
PRINT ‘操作完成!’
go
优化了一下,其实我只需要重建用户表创建时间那个字段的索引就好了,不需要整个数据库索引都重写
3 、查看某个表索引信息
DBCC SHOWCONTIG (usr_users) WITH TABLERESULTS, ALL_INDEXES
4 、重建某个表索引
DBCC DBREINDEX(‘usr_users’)
查询索引字段说明
DBCC SHOWCONTIG
是显示指定的表的数据和索引的碎片信息。
Page Scanned-扫描页数:如果你知道行的近似尺寸和表或索引里的行数,那么你可以估计出索引里的页数。看看扫描页数,如果明显比你估计的页数要高,说明存在内部碎片。
Extents Scanned-扫描扩展盘区数:用扫描页数除以8,四舍五入到下一个最高值。该值应该和DBCC SHOWCONTIG返回的扫描扩展盘区数一致。如果DBCC SHOWCONTIG返回的数高,说明存在外部碎片。碎片的严重程度依赖于刚才显示的值比估计值高多少。
Extent Switches-扩展盘区开关数:该数应该等于扫描扩展盘区数减1。高了则说明有外部碎片。
Avg. Pages per Extent-每个扩展盘区上的平均页数:该数是扫描页数除以扫描扩展盘区数,一般是8。小于8说明有外部碎片。
Scan Density [Best Count:Actual Count]-扫描密度[最佳值:实际值]:DBCC SHOWCONTIG返回最有用的一个百分比。这是扩展盘区的最佳值和实际值的比率。该百分比应该尽可能靠近100%。低了则说明有外部碎片。
Logical Scan Fragmentation-逻辑扫描碎片:无序页的百分比。该百分比应该在0%到10%之间,高了则说明有外部碎片。
Extent Scan Fragmentation-扩展盘区扫描碎片:无序扩展盘区在扫描索引叶级页中所占的百分比。该百分比应该是0%,高了则说明有外部碎片。
Avg. Bytes Free per Page-每页上的平均可用字节数:所扫描的页上的平均可用字节数。越高说明有内部碎片,不过在你用这个数字决定是否有内部碎片之前,应该考虑fill factor(填充因子)。
Avg. Page Density (full)-平均页密度(完整):每页上的平均可用字节数的百分比的相反数。低的百分比说明有内部碎片。
执行修复索引字段
DBCC DBREINDEX( table_name,index_name,fillfactor)
table_name
重新生成指定索引的表名。
index_name
要重新生成的索引名。索引名称必须符合标识符规则。如果指定了 index_name,则必须指定 table_name。如果未指定 index_name 或将其指定为 ‘’(一对单引号),则重新生成表的所有索引。
fillfactor
在创建或重新生成索引时,每个索引页上用于存储数据的空间百分比。在创建索引时,fillfactor 将替换填充因子,从而成为该索引以及重新生成的任何其他非聚集索引(因为已经重新生成了聚集索引)的新默认值。当 fillfactor 为 0 时,DBCC DBREINDEX 将使用上次为索引指定的填充因子值。该值存储在 sys.indexes 目录视图中。
参考:
DBCC DBREINDEX 对指定数据库中的表重新生成一个或多个索引
sqlserver重建索引
SQLServer重建索引【博客园】