如何在不使用sp_updatestats的情况下更新SQL Server 2012中的统计信息?

时间:2014-07-05 17:15:40

标签: sql-server

我已经读过如果我使用命令:

EXEC sp_updatestats

这会根据每个表估计20,000行创建统计信息。我不知道这意味着什么,因为我有很多表少于20行。

有人可以就如果有更准确的更新统计信息的方式向我提供建议,这些方法不会涉及我为每个表格输入命令。

2 个答案:

答案 0 :(得分:0)

以下查询显示需要更新统计信息的表的列表。您可以将游标用于此查询的结果,并更新需要更新统计信息的每个表的统计信息。

SELECT SchemaName, ObjectName, StatisticName, [RowCount], UpdatedCount
FROM (
    SELECT  SCHEMA_NAME(o.schema_id) AS SchemaName,
        OBJECT_NAME(o.object_id) AS ObjectName,
        s.Name AS StatisticName,
        rows AS [RowCount],
        modification_counter AS UpdatedCount,
        modification_counter/rows * 100 AS UpdatePercent,
        rows * -0.00001846153+19.538461 AS threshold
    FROM sys.stats  s
    CROSS APPLY sys.dm_db_stats_properties(s.object_id, s.stats_id) b
    INNER JOIN sys.objects o ON o.object_id = s.object_id
    WHERE OBJECTPROPERTY(o.object_id,'IsUserTable')=1
    )z
WHERE z.UpdatePercent > 20
    OR (z.[RowCount]>=25000 AND z.[RowCount]<=1000000 AND z.UpdatePercent>2 AND z.UpdatePercent > z.threshold)
    OR (z.[RowCount]>1000000 AND z.[RowCount]<=10000000 AND z.UpdatePercent>1)
    OR (z.[RowCount]>10000000 AND z.[RowCount]<=20000000 AND z.UpdatePercent>0.5)
    OR (z.[RowCount]>20000000 AND z.[RowCount]<=30000000 AND z.UpdatePercent>0.25)
ORDER BY z.UpdatePercent

设置Auto Update StatisticsALTER DATABASE YourDatabase SET AUTO_UPDATE_STATISTICS ON)时,当更新的行数为计数行的20%时,sql server会自动更新表的统计信息。乍一看似乎很好看。但20%的小桌子与20%的大桌子非常不同。换句话说,如果你的表有100行,每次更新20行受影响,sql server会自动更新你的表的统计信息,但如果你的表有100,000,000行,每次更新20,000,000行受影响,sql server会自动更新此表的统计信息这个更新行需要很长时间才能受到影响。当更新的行数占总行数的20%时,似乎小表需要更新统计信息,当更新的行数占总行数的1%时,larg表需要更新统计信息。在我的查询中,我显示需要根据表行数和更新行计数更新统计信息的表列表。

答案 1 :(得分:-1)

为什么要以微软推荐的其他方式收集统计信息?

  

更准确地更新不涉及我的统计信息的方法   输入每个表的命令

此命令更新当前数据库中所有表的统计信息,您不需要为数据库中的每个表输入此命令:

EXEC sp_updatestats;

您也可以使用UPDATE STATISTICS命令。我不知道UPDATE STATISTiCS相对于sp_updatestats的优势,我认为你可以同时使用它们。

这是收集数据实际统计信息的好方法,但请注意,这可能是繁重的操作,需要很多服务器资源。如果有可能,我建议在大多数用户不使用数据时收集统计信息。

您可以找到in this post的其他维护解决方案(如重建和重新组织索引)。