自从上次菜鸟为老鸟解决了《RDS SQL SERVER 解决中文乱码问题》问题,老鸟意犹未尽,决定再想个招来刁难刁难菜鸟:“我最近做T-SQL性能调优的时候,经常发现执行计划中的统计信息不准确,导致SQL Server查询性能低下,想个办法帮我一次性更新实例所有数据库下所有表统计信息吧?”
“要一次性更新实例级别所有数据库下所有表统计信息啊,这个还真的有点犯难”,菜鸟一边小声嘀咕,一边不停的问G哥,终于功夫不负有心人,发现了两个非常有意思的系统存储过程。这两个系统存储过程均为SQL Server未对外公开(Undocumented)的系统存储过程,但是对于DBA或者日常数据库管理人员,非常有用。今天我们就可以使用它们来快速简洁的解决掉老鸟的问题。查询这两个系统存储过程,需要在sys.all_objects中查找:
USE master GO SELECT * FROM sys.all_objects WITH(NOLOCK) WHERE name IN('sp_msforeachtable','sp_msforeachdb')如下截图简单的功能解释sys.sp_MSforeachdb:SQL Server遍历该实例下所有的数据库,包含系统数据库。sys.sp_MSforeachtable:SQL Server遍历某一个数据库下所有的表对象。
好了,有了对这两个系统存储过程粗略的认识,让我们来如何解决老鸟的问题。话不多说,直接代码伺候
USE master GO DECLARE @sql NVARCHAR(MAX) ; SET @sql = N' USE [?] IF ''?'' NOT IN(''master'', ''model'', ''msdb'', ''tempdb'', ''distribution'') BEGIN RAISERROR(N''---------------------------------------------------------------- Search on database: ?'', 10, 1) WITH NOWAIT EXEC SYS.SP_MSFOREACHTABLE N'' UPDATE STATISTICS * WITH FULLSCAN RAISERROR(''''on table:*'''',10,1) with nowait'' ,@replacechar =N''*'' ,@whereand=N''and o.name NOT LIKE ''''#%'''''' END ' ; EXEC SYS.SP_MSFOREACHDB @sql,@replacechar=N'?'哇,相当牛X,总共仅仅24行代码解决了老鸟的所有问题,一次性,简单,快捷,简洁的更新了老鸟的表统计信息,这下老鸟不会再遇到统计信息未及时更新的问题了。嘚瑟下执行结果输出,限于篇幅,省略掉了一些输出:
---------------------------------------------------------------- Search on database: ReportServer on table:[dbo].[History] on table:[dbo].[ConfigurationInfo] on table:[dbo].[Catalog] ... on table:[dbo].[ServerUpgradeHistory] ---------------------------------------------------------------- Search on database: ReportServerTempDB on table:[dbo].[ExecutionCache] on table:[dbo].[SnapshotData] ... on table:[dbo].[SessionData] ---------------------------------------------------------------- Search on database: AdventureWorks2008R2 on table:[Production].[ProductInventory] on table:[Sales].[SpecialOffer] on table:[Person].[Address] ... on table:[dbo].[ErrorLog] ---------------------------------------------------------------- ...这段脚本很好很强大,威猛又持久,如果需要在产品环境使用,请选择在流量低谷时段执行,以免对你的生产线SQL Server数据库造成超预期的影响。
相关资源:python入门教程(PDF版)