电脑桌面
添加蚂蚁七词文库到电脑桌面
安装后可以在桌面快捷访问

立竿见影的数据库优化脚本以及定时自动优化,特别适用私有云&混合云

来源:金蝶云社区作者:金蝶2024-09-164

立竿见影的数据库优化脚本以及定时自动优化,特别适用私有云&混合云

哈喽,小伙伴们,大家好啊!

    昨日遇到一名资深同行提问,金蝶云星空(数据库239GB大小)系统,在执行成本计算时,在某1步卡住了1.5小时。

    经过长时间的摸排分析,以及相互交流探讨,我们最终形成了一套可行的数据库性能优化方法,并付诸实践,故障立刻被搞定,效果立竿见影,性能提升明显。

    问题摸排分析的过程,可参阅此提问与回答:执行成本计算,过程中卡死 

    接下来,本人将奉献出,经由本人萃取整理的数据库全库优化四步脚本。



/*可一次全部执行,不必分4次。4段语句均为执行全库扫描与优化,故耗时会很久。

执行期间将会拖慢金蝶系统性能,强烈要求必须放在系统空闲时执行。

SQL源代码请见文尾附件,作者:深圳周少斌*/

SET NOCOUNT ON --关闭统计以提升整体执行效率

declare @StepStartTime datetime,@GlobalStartTime datetime --时长统计公共变量:步进开始时间,全局开始时间。

select @StepStartTime=getdate(),@GlobalStartTime=getdate()

declare @TableName TABLE(name nvarchar(100) NOT NULL,UNIQUE CLUSTERED(name)) --声明表变量:待优化的数据库物理表名清单。

declare @TableNameForLoop TABLE(name nvarchar(100) NOT NULL,UNIQUE CLUSTERED(name)) --声明表变量:待优化的数据库物理表名清单_用于循环。

declare @name nvarchar(100),@SqlStr nvarchar(300) --声明变量:待优化物理表名,优化语句。

Insert into @TableName SELECT name from sysobjects where xtype='U' and (name not like'TMP%') --初始化表变量:待优化的数据库物理表名清单


--第1步.重建索引,整理碎片

Insert into @TableNameForLoop SELECT * from @TableName --初始化表变量:用于循环待优化的数据库物理表名清单_用于循环

WHILE EXISTS(SELECT top 100 percent name FROM @TableNameForLoop order by Name)

begin  

  select top 1 @name=name,@SqlStr='' FROM @TableNameForLoop order by Name --取值@TableNameForLoop的第一行

  delete from @TableNameForLoop WHERE name=@name;--删除上一行语句已取值的行。

  set @SqlStr='alter index all on ['+@name+'] rebuild;' --拼接优化语句与待优化物理表名

  BEGIN TRY exec (@SqlStr) END TRY BEGIN CATCH END CATCH --执行优化语句,如果有异常就直接吞掉,继续循环。

end

print '第1步执行时长:'+Convert(Nvarchar(50),Convert(decimal(18,2),ROUND(Convert(decimal(38,20),(datediff(ms,@StepStartTime,getdate())))/60000,2)))+'分钟'; --统计单步执行时长

set @StepStartTime=getdate();


--第2步.更新统计信息,以利于SQL Server后台优化执行计划

Insert into @TableNameForLoop SELECT * from @TableName --重新初始化表变量:用于循环待优化的数据库物理表名清单_用于循环

WHILE EXISTS(SELECT top 100 percent name FROM @TableNameForLoop order by Name)

begin  

  select top 1 @name=name,@SqlStr='' FROM @TableNameForLoop order by Name --取值@TableNameForLoop的第一行

  delete from @TableNameForLoop WHERE name=@name;--删除上一行语句已取值的行。

  set @SqlStr='UPDATE STATISTICS ['+@name+'];' --拼接优化语句与待优化物理表名

  BEGIN TRY exec (@SqlStr) END TRY BEGIN CATCH END CATCH --执行优化语句,如果有异常就直接吞掉,继续循环。

end

print '第2步执行时长:'+Convert(Nvarchar(50),Convert(decimal(18,2),ROUND(Convert(decimal(38,20),(datediff(ms,@StepStartTime,getdate())))/60000,2)))+'分钟'; --统计单步执行时长

set @StepStartTime=getdate();


--第3步.压缩索引以提升I/O性能(注意,这里并不是收缩数据库,而是压缩索引)

Insert into @TableNameForLoop SELECT * from @TableName --重新初始化表变量:用于循环待优化的数据库物理表名清单_用于循环

WHILE EXISTS(SELECT top 100 percent name FROM @TableNameForLoop order by Name)

begin  

  select top 1 @name=name,@SqlStr='' FROM @TableNameForLoop order by Name --取值@TableNameForLoop的第一行

  delete from @TableNameForLoop WHERE Name=@name;--删除上一行语句已取值的行。

  set @SqlStr='alter index all on ['+@name+ '] rebuild WITH (DATA_COMPRESSION=ROW);' --拼接优化语句与待优化物理表名

  BEGIN TRY exec (@SqlStr) END TRY BEGIN CATCH END CATCH --执行优化语句,如果有异常就直接吞掉,继续循环。

end

print '第3步执行时长:'+Convert(Nvarchar(50),Convert(decimal(18,2),ROUND(Convert(decimal(38,20),(datediff(ms,@StepStartTime,getdate())))/60000,2)))+'分钟'; --统计单步执行时长

set @StepStartTime=getdate();


--第4步.压缩数据表以提升I/O性能(注意,这里并不是收缩数据库,而是压缩物理表)

Insert into @TableNameForLoop SELECT * from @TableName --重新初始化表变量:用于循环待优化的数据库物理表名清单_用于循环

WHILE EXISTS(SELECT top 100 percent name FROM @TableNameForLoop order by Name)

begin  

  select top 1 @name=name,@SqlStr='' FROM @TableNameForLoop order by Name --取值@TableNameForLoop的第一行

  delete from @TableNameForLoop WHERE Name=@name;--删除上一行语句已取值的行。

  set @SqlStr='alt

立竿见影的数据库优化脚本以及定时自动优化,特别适用私有云&混合云

哈喽,小伙伴们,大家好啊! 昨日遇到一名资深同行提问,金蝶云星空(数据库239GB大小)系统,在执行成本计算时,在某1步卡住了1.5小...
点击下载文档文档为doc格式

声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。

已经是第一篇
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息
QQ群
  • 答案:my7c点击这里加入QQ群
支持邮箱
微信
  • 微信