AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 145982
Accepted
Pரதீப்
Pரதீப்
Asked: 2016-08-06 02:18:16 +0800 CST2016-08-06 02:18:16 +0800 CST 2016-08-06 02:18:16 +0800 CST

sp_updatestats 与更新统计信息

  • 772

使用不sp_updatestats重新采样更新表的统计信息和不使用更新表的统计信息之间有什么区别吗UPDATE STATISTICSsample options(FULLSCAN,SAMPLE PERCENT,RESAMPLE)

exec sp_updatestats 与更新统计表名

sp_updatestats使用默认值更新表NO将使用默认采样率更新统计信息。

同样,使用UPDATE STATISTICSwithoutsample options(FULLSCAN,SAMPLE PERCENT,RESAMPLE)更新表的统计信息也将使用默认采样更新表统计信息。

那么这两种方法有什么区别吗?我在这里错过了什么吗?

更新 :

我知道它sp_updatestats在所有表上运行,但使用UPDATE STATISTICS我们可以更新特定表的统计信息。

sql-server statistics
  • 4 4 个回答
  • 29068 Views

4 个回答

  • Voted
  1. Best Answer
    Shanky
    2016-08-06T03:10:32+08:002016-08-06T03:10:32+08:00

    使用不重新采样的 sp_updatestats 更新表的统计信息和使用不带样本选项的 UPDATE STATISTICS 更新表的统计信息(FULLSCAN、SAMPLE PERCENT、RESAMPLE)之间有什么区别吗?

    除了@Gameiswar 已经提到的内容之外,我知道的另一个区别是sp_updatestats,当您为数据库的所有表运行它时,它只会更新至少有一行更改的表的统计信息。波尔说

    对于基于磁盘的表,sp_updatestats 仅根据 sys.sysindexes 目录视图中的 rowmodctr 信息更新需要更新的统计信息,从而避免对未更改行的统计信息进行不必要的更新。

    因此,当您运行 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%,具体取决于实际值及其偏差。

    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;
    

    如果您想避免所有此类麻烦,您还可以使用 Ola Hallengren 更新统计脚本,它会处理很多此类事情。

    • 6
  2. Tom V
    2016-08-06T03:35:32+08:002016-08-06T03:35:32+08:00

    的代码sp_updatestats相当简单,您可以通过创建mssqlsystemresource数据库的副本来查看它。只需将 mdf 和 ldf 文件复制到某处并将它们附加为具有另一个名称的数据库。

    从BOL中可以看出,该语句采用 1 个参数,重新采样:

    ALTER procedure [sys].[sp_updatestats]
        @resample char(8)='NO'
    as
    

    我认为在这里发布整个过程不是一个好主意,您可以自己看一下,但基本上这是一个简单的过程。

    在该过程中,它遍历数据库中的表,执行一些基本检查,例如检查表是否禁用了聚集索引,检查表是否为 hekathon(以确定表上的统计信息列表是否应该从 sys.stats 或 sys.indexes 中读取),再次检查它是否是 hekathon 表以在 hekathon 表的情况下添加 fullscan,然后执行简单的 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
    

    除非统计信息禁用了自动统计,否则它还会添加一个NORECOMPUTE子句

    UPDATE STATISTICS因此,如果它们没有禁用自动统计并且不在内存优化表上,那么简单地调用每个统计信息并没有太大区别。

    • 6
  3. TheGameiswar
    2016-08-06T02:29:47+08:002016-08-06T02:29:47+08:00

    我们使用它们的方式有所不同..

    Sp_updatestats:
    sp_updatestats 通过指定 ALL 关键字对数据库中的所有用户定义表和内部表执行 UPDATE STATISTICS。我们不能使用此选项要求 SQL 仅更新单个表/索引的统计信息,

    更新统计:
    使用更新统计,您可以更新统计 PerTable/Index..

    使用不重新采样的 sp_updatestats 更新表的统计信息和使用不带样本选项的 UPDATE STATISTICS 更新表的统计信息(FULLSCAN、SAMPLE PERCENT、RESAMPLE)之间有什么区别吗?

    如果未指定 'resample',sp_updatestats 将使用默认采样更新统计信息。

    对于更新统计信息,当未指定任何样本选项(SAMPLE、FULLSCAN、RESAMPLE)时,查询优化器默认对数据进行采样并计算样本大小。

    • 2
  4. Prakash BhojeGowda
    2019-05-29T06:21:31+08:002019-05-29T06:21:31+08:00

    SP_Updatestats 的采样率非常低,例如 0.05%。特别是在 VLDB 上,建议在每个表上使用 DBCC 更新统计信息,以通过适当的采样更新统计信息。最好是使用全扫描执行 DBCC 更新统计信息。如果这不可能,请使用 25% 的采样率。

    • -2

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve