Pரத*_*ீப் 7 sql-server statistics
使用sp_updatestats不重新采样更新表的统计信息和使用UPDATE STATISTICS不带重新采样更新表的统计信息之间有什么区别吗?sample options(FULLSCAN,SAMPLE PERCENT,RESAMPLE)
exec sp_updatestats vs 更新统计表名
使用sp_updatestats默认值更新表NO将使用默认采样率更新统计信息。
同样,使用UPDATE STATISTICSwithoutsample options(FULLSCAN,SAMPLE PERCENT,RESAMPLE)更新表的统计信息也会使用默认采样更新表统计信息。
那么这两种方法有什么区别吗?我在这里错过了什么吗?
更新 :
我知道sp_updatestats在所有表上运行,但使用UPDATE STATISTICS我们可以更新特定表的统计信息。
使用不带重新采样的 sp_updatestats 更新表的统计信息与使用不带示例选项的 UPDATE STATISTICS 更新表的统计信息(FULLSCAN、SAMPLE PERCENT、RESAMPLE)之间有什么区别
添加到@Gameiswar 已经提到的内容之外,我知道的另一个区别是sp_updatestats,当您为所有数据库表运行它时,它只会更新至少有一行更改的表的统计信息。BOL说
对于基于磁盘的表,sp_updatestats 仅根据 sys.sysindexes 目录视图中的 rowmodctr 信息更新需要更新的统计信息,从而避免对未更改行的统计信息进行不必要的更新。
因此,当您运行 sp_updatestats 并且它说所有表的统计信息都已更新时,这仅对于至少更改了一行的表是不正确/误导的,统计信息已更新。
在使用 UPDATE STATISTICS 时,您有很多选项可用于统计更新。
另外,当您使用完全扫描或默认选项重建索引时,该索引的统计信息会更新,因此无需再次为其重建统计信息。
PS:无论有什么区别,我都不会使用 sp_updatestats 因为它用来更新统计数据的机制不好,如果只有一行发生了变化并且我在表中有 100K 行,我为什么要更新表的统计数据,它只会消耗资源并导致更多问题。
编辑:
如果您想有选择地更新统计信息并且不想运行 sp_updatestas,请使用以下查询来过滤掉过时的统计信息。此查询使用 DMF 并且可以从SQL Server 2008 R2 SP2 , SQL Server 2012 Sp1 and above,复制自Erin Stellato 的博客
注意:意识到不同的表可能有不同的阈值,您需要为您的数据库调整上面的查询。对于某些表,等到 15% 或 20% 的行被修改可能没问题。但对于其他人,您可能需要以 10% 甚至 5% 进行更新,具体取决于实际值及其偏差。
SELECT [sch].[name] + '.' + [so].[name] AS [TableName] ,
[ss].[name] AS [Statistic],
[sp].[last_updated] AS [StatsLastUpdated] ,
[sp].[rows] AS [RowsInTable] ,
[sp].[rows_sampled] AS [RowsSampled] ,
[sp].[modification_counter] AS [RowModifications]
FROM [sys].[stats] [ss]
JOIN [sys].[objects] [so] ON [ss].[object_id] = [so].[object_id]
JOIN [sys].[schemas] [sch] ON [so].[schema_id] = [sch].[schema_id]
OUTER APPLY [sys].[dm_db_stats_properties]([so].[object_id],
[ss].[stats_id]) sp
WHERE [so].[type] = 'U'
AND [sp].[modification_counter] > 0--change accordingly
ORDER BY [sp].[last_updated] DESC;
Run Code Online (Sandbox Code Playgroud)
如果你想避免所有这些麻烦,你也可以使用 Ola Hallengren 更新统计脚本,它可以处理很多这样的事情。
的代码sp_updatestats相当简单,您可以通过创建mssqlsystemresource数据库的副本来查看它。只需将 mdf 和 ldf 文件复制到某处,并将它们附加为具有另一个名称的数据库。
从BOL 中可以看出,该语句采用 1 个参数,重新采样:
ALTER procedure [sys].[sp_updatestats]
@resample char(8)='NO'
as
Run Code Online (Sandbox Code Playgroud)
我认为把整个过程贴在这里不是一个好主意,你可以自己看看,但基本上是一个简单的过程。
在该过程中,它遍历数据库中的表,执行一些基本检查,例如检查表是否禁用了聚集索引,检查表是否为 hekathon(以确定表的统计信息列表是否应该从 sys.stats 或 sys.indexes 中读取),再次检查它是否是 hekathon 表以在 hekathon 表的情况下添加全扫描,然后执行简单的 UPDATE STATISTICS。
基本上这三个语句之一对数据库中的所有统计信息执行
-- When resample is yes
UPDATE STATISTICS [sysname].[sysname] [sysname] WITH RESAMPLE
-- When resample is no
UPDATE STATISTICS [sysname].[sysname] [sysname]
-- For a hekathon table
UPDATE STATISTICS [sysname].[sysname] [sysname] WITH FULLSCAN
Run Code Online (Sandbox Code Playgroud)
除了统计信息禁用了自动统计之外,它还添加了一个NORECOMPUTE子句
因此,UPDATE STATISTICS如果它们没有禁用自动统计并且不在内存优化表上,那么简单地调用每个统计信息之间没有太大区别。
| 归档时间: |
|
| 查看次数: |
26856 次 |
| 最近记录: |