周四晚上要把测试数据库结构备份一份周五到客户方部署到客户的测试服务器上。数据库
以前备份一个库通常几分钟十几分钟吧,⏰18点下班的我决定17点停掉测试站点开始备份数据,嘻嘻~服务器
二十分钟后数据备份完成,看了下文件大小20G,俺擦怎么拷到客户机,并且也不该该有这么大的数据,因而开始下面的表演~测试
SELECT a.name AS 表名 , MAX(b.rows) AS 记录条数 FROM sys.sysobjects AS a INNER JOIN sys.sysindexes AS b ON a.id = b.id WHERE ( a.xtype = 'u' ) GROUP BY a.name ORDER BY 记录条数 DESC;
发现有张表有九千五百万数据spa
看看这张表里都是什么数据:SELECT TOP 100 * FROM RoomStatus_Dump3d
啊~难受😭 。一个SELECT执行了3分钟。日志
检查发现有2011年的数据,只有6千条2019年的数据是须要的,2019年之前的数据全删掉吧😡code
使用truncate大概1秒就搞定了,好嗨哟~使用delete,但在删除时我能够根据条件时间小于2019年吗?(上面查询100条用了三分钟)blog
因而决定时间倒叙查询后按月删吧,删了几回后总结出来规律,每删除1千万数据(6个月数据量)大概须要十分钟索引
算了一下:(2019-2011)* 2 * 10=160分钟;去领个盒饭吧~🍗事务
我以为可能这张表的索引碎片膨胀了
--检查表的索引碎片状况 DECLARE @table_id INT; SET @table_id = OBJECT_ID('RoomStatus_Dump'); --执行 DBCC SHOWCONTIG(@table_id);
解释以下:
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)-平均页密度(完整):
每页上的平都可用字节数的百分比的相反数。低的百分比说明有内部碎片
有不少方法,我这里使用删除重建索引🤺
--删除索引 DROP INDEX RoomStatus_Dump.idx_RoomStatus_Dump_hotelid DROP INDEX RoomStatus_Dump.PK_RoomStatus_Dump --汇集索引 create CLUSTERED INDEX PK_RoomStatus_Dump ON RoomStatus_Dump(字段, 字段, 字段) --建立非汇集索引 create NONCLUSTERED INDEX idx_RoomStatus_Dump_hotelid ON RoomStatus_Dump(字段)
再来看下索引碎片状况,完美~👏
DELETE是DML,执行DELETE操做时,每次从表中删除一行,而且同时将该行的的删除操做记录在redo和undo表空间中以便进行回滚(rollback)和重作操做,但要注意表空间要足够大,须要手动提交(commit)操做才能生效,能够经过rollback撤消操做。
好吧删除日志,查看日志存放位置:右键数据库→属性→文件
日志文件已经80G了😂
数据库属性→选项 恢复模式设置为简单
右键数据库→任务→收缩→文件
再检查下日志只有几兆了,删完记得把恢复模式再改回完整。
删除后备份文件500M,能接受。
⌚19:50
🏍溜了溜了
将表生成脚本,建立新的表,将6千条须要的数据插入到新表,而后truncate掉旧表,将新表更名为旧表的表名。
十分钟搞定😝