使用不sp_updatestats
重新采样更新表的统计信息和不使用更新表的统计信息之间有什么区别吗UPDATE STATISTICS
sample options(FULLSCAN,SAMPLE PERCENT,RESAMPLE)
exec sp_updatestats 与更新统计表名
sp_updatestats
使用默认值更新表NO
将使用默认采样率更新统计信息。
同样,使用UPDATE STATISTICS
withoutsample options(FULLSCAN,SAMPLE PERCENT,RESAMPLE)
更新表的统计信息也将使用默认采样更新表统计信息。
那么这两种方法有什么区别吗?我在这里错过了什么吗?
更新 :
我知道它sp_updatestats
在所有表上运行,但使用UPDATE STATISTICS
我们可以更新特定表的统计信息。
除了@Gameiswar 已经提到的内容之外,我知道的另一个区别是
sp_updatestats
,当您为数据库的所有表运行它时,它只会更新至少有一行更改的表的统计信息。波尔说因此,当您运行 sp_updatestats 并且它说所有表的统计信息都已更新时,这仅对于至少更改了一行的表是不正确/误导的。
在使用 UPDATE STATISTICS 时,您有很多选项可用于更新统计信息。
另外,当您使用完全扫描或使用默认选项重建索引时,该索引的统计信息会更新,因此无需再次为其重建统计信息。
PS:无论有什么不同,我都不会使用 sp_updatestats,因为它用来更新统计信息的机制不好,如果只有一行发生了变化并且我有 100K 行在表中,我为什么要更新表的统计信息,它只会消耗资源并引起更多问题。
编辑:
如果您想有选择地更新统计信息并且不想运行 sp_updatestas,请使用以下查询来过滤掉过时的统计信息。此查询使用 DMF 并且可以从Erin Stellato 的博客
SQL Server 2008 R2 SP2 , SQL Server 2012 Sp1 and above
中复制注意:意识到不同的表可能有不同的阈值,您需要为您的数据库调整上面的查询。对于某些表,等到 15% 或 20% 的行被修改可能是可以的。但对于其他人,您可能需要更新 10% 甚至 5%,具体取决于实际值及其偏差。
如果您想避免所有此类麻烦,您还可以使用 Ola Hallengren 更新统计脚本,它会处理很多此类事情。
的代码
sp_updatestats
相当简单,您可以通过创建mssqlsystemresource
数据库的副本来查看它。只需将 mdf 和 ldf 文件复制到某处并将它们附加为具有另一个名称的数据库。从BOL中可以看出,该语句采用 1 个参数,重新采样:
我认为在这里发布整个过程不是一个好主意,您可以自己看一下,但基本上这是一个简单的过程。
在该过程中,它遍历数据库中的表,执行一些基本检查,例如检查表是否禁用了聚集索引,检查表是否为 hekathon(以确定表上的统计信息列表是否应该从 sys.stats 或 sys.indexes 中读取),再次检查它是否是 hekathon 表以在 hekathon 表的情况下添加 fullscan,然后执行简单的 UPDATE STATISTICS。
基本上这三个语句之一是在数据库中的所有统计信息上执行的
除非统计信息禁用了自动统计,否则它还会添加一个
NORECOMPUTE
子句UPDATE STATISTICS
因此,如果它们没有禁用自动统计并且不在内存优化表上,那么简单地调用每个统计信息并没有太大区别。我们使用它们的方式有所不同..
Sp_updatestats:
sp_updatestats 通过指定 ALL 关键字对数据库中的所有用户定义表和内部表执行 UPDATE STATISTICS。我们不能使用此选项要求 SQL 仅更新单个表/索引的统计信息,
更新统计:
使用更新统计,您可以更新统计 PerTable/Index..
如果未指定 'resample',sp_updatestats 将使用默认采样更新统计信息。
对于更新统计信息,当未指定任何样本选项(SAMPLE、FULLSCAN、RESAMPLE)时,查询优化器默认对数据进行采样并计算样本大小。
SP_Updatestats 的采样率非常低,例如 0.05%。特别是在 VLDB 上,建议在每个表上使用 DBCC 更新统计信息,以通过适当的采样更新统计信息。最好是使用全扫描执行 DBCC 更新统计信息。如果这不可能,请使用 25% 的采样率。