发现需要统计更新的表

发现需要统计更新的表

--王成辉翻译整理,转贴请注明出自微软BI开拓者www.windbi.com
--
原帖地址

索引和表统计在OLTP数据库里为了更好的性能扮演着重要的角色。基本上每周一次的统计维护是重要的,而且大量更新数据库表需要更加着重于统计和更新频率。而不是试图执行sp_updatestats?对于整个数据库而言,你可以选择那些需要大量更新和维护的表去进行更新。

下面的脚本(存储过程)用来获得哪些表被更新了,自最后一次更新以来多少行被更新的信息。脚本也产生脚本去在数据库上运行以更新那些统计过期的表的统计。

/*
在master数据库上运行下面的脚本产生存储过程。存储过程有两个输入参数@dbname和@option

@dbname-你要更新统计的数据库的名称

@option-输入参数I表示只列出信息,输入A表示产生进行统计更新的语句,将此语句复制到相应的数据库执行即可


Exec sp_dba_ShowMe_TableStats
'@dbname','@action'

示例1: EXEC sp_dba_ShowMe_TableStats 'pubs','I'

结果:

Table Name      Index Name        Rows Modified
newTitles  newTitles  18
EMPSTAT_DIM EMPSTAT_DIM_idx1 1704364
PJR_Sales  PJR_Sales  1704364
PJR_Sales  PJR_Sales  704364

示例2: 用参数A执行存储过程将得到下面的结果

EXEC sp_dba_ShowMe_TableStats 'pubs','A'
Results
---------------------------------
UPDATE STATISTICS EMPSTAT_DIM GO
UPDATE STATISTICS newTitles GO
UPDATE STATISTICS PJR_Sales GO


*/
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

CREATE PROCEDURE sp_dba_ShowMe_TableStats @dbname sysname=NULL, @option char (1) = NULL
AS
--- 翻译整理:王成辉
BEGIN
Declare @what char(1),
@qry varchar(2000)
set @what = @option


IF @what = 'I'
Begin
set @qry = ' Use ' + @dbName +' SELECT substring(o.name,1,50) AS [table name], substring(o.name,1,50) AS [Index Name], i.rowmodctr AS [Rows Modified]
FROM SYSOBJECTS o JOIN SYSINDEXES i
ON o.id = i.id
WHERE i.rowmodctr > 0  and o.xtype = ''U''
ORDER BY i.rowmodctr DESC'
exec (@qry)
End

ELSE IF @what = 'A'
Begin
Print space(10)+' Run the Update Statistics on the following Tables'
SET @qry = 'SET NOCOUNT ON'+char(13)+ 'Use ' +  @dbName + ' SELECT Distinct ''UPDATE STATISTICS''+SPACE(1)+O.NAME+CHAR(13)+''GO''  FROM SYSOBJECTS O
JOIN SYSINDEXES i ON o.id = i.id
WHERE i.rowmodctr > 0 and o.xtype = ''U''
---ORDER BY O.NAME'
exec (@qry)
End

ELSE
Begin
Print space(10)+'Please pass in the right parameters : DBName and option "I" for Information or "A" Action"'
PRINT '-------------------------------------------------------------------------------------------------------------------------------------'
set @qry = ' Use ' + @dbName +' SELECT substring(o.name,1,50) AS [table name], substring(o.name,1,50) AS [Index Name], i.rowmodctr AS [Rows Modified]
FROM SYSOBJECTS o JOIN SYSINDEXES i
ON o.id = i.id
WHERE i.rowmodctr > 0  and o.xtype = ''U''
ORDER BY i.rowmodctr DESC'
exec (@qry)
End
END
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
虽有智慧,不如乘势;虽有鎡基,不如待时。
君子学以聚之,问以辨之,宽以居之,仁以行之。
独学而无友,则孤陋而寡闻。