我已经读过如果我使用命令:
EXEC sp_updatestats
这会根据每个表估计20,000行创建统计信息。我不知道这意味着什么,因为我有很多表少于20行。
有人可以就如果有更准确的更新统计信息的方式向我提供建议,这些方法不会涉及我为每个表格输入命令。
答案 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 Statistics
(ALTER 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的其他维护解决方案(如重建和重新组织索引)。