关于更新SQLserver统计信息的存储过程

1、建立t_mon_table_stat 用于存过需要更新统计信息的表

2、查找需要更新统计信息的表

点击(此处)折叠或打开

  1. insert into t_mon_table_stat
  2. SELECT DISTINCT SP.rows/SSI.rowmodctr rowdiff,
  3.         OBJECT_NAME(SI.object_id) AS Table_Name ,
  4.         SI.name AS Statistics_Name ,
  5.         STATS_DATE(SI.object_id, SI.index_id) AS Last_Stat_Update_Date ,
  6.         SSI.rowmodctr AS RowModCTR ,
  7.         SP.rows AS Total_Rows_In_Table ,
  8.         \'UPDATE STATISTICS [\' + SCHEMA_NAME(SO.schema_id) + \'].[\'
  9.         + OBJECT_NAME(SI.object_id) + \']\' + SPACE(2) + SI.name AS Update_Stats_Script ,current_timestamp,0,null
  10. FROM sys.indexes AS SI( NOLOCK )
  11.         INNER JOIN sys.objects AS SO( NOLOCK ) ON SI.object_id = SO.object_id
  12.         INNER JOIN sys.sysindexes SSI( NOLOCK ) ON SI.object_id = SSI.id
  13.                                                     AND SI.index_id = SSI.indid
  14.         INNER JOIN sys.partitions AS SP ON SI.object_id = SP.object_id         
  15. WHERE SSI.rowmodctr > 0
  16.         AND STATS_DATE(SI.object_id, SI.index_id) IS NOT NULL
  17.         AND SO.type = \'U\'
  18.         and abs(SP.rows-SSI.rowmodctr)>10000
  19.         and (SP.rows/SSI.rowmodctr <0.4 or SP.rows/SSI.rowmodctr >2.5)
  20.         and OBJECT_NAME(SI.object_id) not like \'%History_%\' --排除历史表
  21.         and STATS_DATE(SI.object_id, SI.index_id)< dateadd(dd,-2,getdate()) --最近7天未更新统计信息
  22.         and OBJECT_NAME(SI.object_id) not like \'%-%\'



3、创建存储过程

点击(此处)折叠或打开

  1. create procedure dbo.p_mon_upate_table_statistics
  2. as
  3. begin
  4.      
  5.   declare
  6.       @datetime datetime
  7.      set @datetime=getdate()

  8.      declare update_tab_stat_cur cursor for select distinct table_name ,Update_Stats_Script,check_date from t_mon_table_stat
  9.      where check_date>dateadd(dd,-1,@datetime) and check_date<dateadd(dd,1,@datetime)

  10.      open update_tab_stat_cur
  11.    
  12.    --声明变量
  13.    declare @sql varchar(1000)
  14.    declare @table_name varchar(100)
  15.    declare @check_date datetime

  16.      fetch next from update_tab_stat_cur into @table_name ,@sql ,@check_date
  17.     
  18.    while @@FETCH_STATUS =0
  19.      begin
  20.      ---更新check_status状态
  21.          update a set a.Check_Status=1 from t_mon_table_stat a where a.check_date =@check_date and a.table_name =@table_name and Check_Status in (0);
  22.         
  23.          exec(@sql)
  24.         
  25.          if @@ROWCOUNT >0
  26.          begin
  27.          ---更新update_Date 和 Check_Status的值
  28.      update a set a.update_Date=getdate(),a.Check_Status=2 from t_mon_table_stat a where a.check_date =@check_date and a.table_name =@table_name and Check_Status=1;
  29.      end
  30.          fetch next from update_tab_stat_cur into @table_name ,@sql ,@check_date
  31.      end

  32.      ---关闭游标
  33.      close update_tab_stat_cur

  34.      ---释放游标资源
  35.      deallocate update_tab_stat_cur
  36. end
4、然后将改存储过程放到作业里面去就OK

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29507357/viewspace-1720546/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29507357/viewspace-1720546/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值