在 $ SQL Server 中的统计维护功能 (autostats)

文章翻译 文章翻译
文章编号: 195565 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

新引入统计维护功能的 AutoStat,可能会生成不需要的系统开销在生产系统上,请执行下列操作之一:
  • 正在初始化期间大量生产的统计更新。

    -或者-
  • 在 $ 时间中启动过大量更新统计信息在指定点的流程。
本文的目的是详细描述在其下,您可以想查看 autostats 生成和更新统计信息对数据库的表中正在运行的条件。

有关 autostats SQL Server 2000 中,请参阅"统计使用者中 Microsoft SQL Server 2000 查询优化程序"在下面的 MSDN 网站:
http://msdn2.microsoft.com/en-us/library/aa902688(SQL.80).aspx


注意如果使用的 Microsoft SQL Server 2005,请参见下面的 Microsoft 白皮书,有关统计由查询优化器 SQL Server 2005 中的使用方式的信息:
http://technet.microsoft.com/en-us/library/cc966419.aspx

更多信息

一般信息

SQL Server 使用基于开销的优化程序,可提供了有关表和索引的统计信息极其敏感的。不正确的和最新状态的统计信息可以被 SQL Server 质询来确定最佳的执行计划,为特定的查询。

SQL Server cost-based 决策制定能力包括有助于优化程序中的每个表上维护的统计信息在:
  • 在表中的行数。
  • 使用表的页的数目。
  • 在表的项从上一次更新统计信息以来所做的修改的数量。
其他信息存储 (每个索引) 包括的索引为:
  • 在第一列上的同等高度直方图。
  • 所有的列前缀的密度。
  • 平均键长度。
每当构建新的索引时,会自动创建索引的统计信息。此外,则现在可以创建和维护以及其他列的统计信息。

若要能够尽可能统计信息为最新的方式 SQL Server 引入 AutoStat,通过 SQL Server 的监视表修改的是能够在达到某个特定阈值的更改时自动更新的表统计信息。 此外,SQL Server 引入了自动创建的统计,从而导致服务器自动生成的准确的具体的查询优化所需的所有统计信息。

确定 AutoStat 代即将发生时

前面已提到 AutoStat 将自动更新为特定表统计信息时达到了一个"更改阀值"。sysindexes.rowmodctr 列维护运行总的随时间,可能会影响查询处理器的决策使流程表的所有修改。每次在以下任一事件发生时,此计数器会更新:
  • 由单个行插入。
  • 由单个行删除。
  • 由一个索引列的更新。
: TRUNCATE TABLE 并不会更新 rowmodctr。

已更新表统计信息之后,rowmodctr 值重置为 0,并更新表的统计信息的架构版本。

进一步情况下,在其中存储的过程的执行计划从缓存中提取和该计划写统计,统计信息的架构版本将与当前版本进行比较。如果没有可用的新统计信息将被重新编译存储过程的计划。

自动更新统计信息的基本的算法是:
  • 如果表的基数是少于六个,并且表是在 tempdb 数据库中自动更新到表的每隔六个修改。
  • 如果表的基数是大于 6,但小于或等于 500,更新状态每隔 500 的修改。
  • 如果基数为表大于 500,更新统计信息时 (500 + 20%的表) 已发生更改。
  • 表变量的基数的更改不会触发自动更新统计信息。
: 在此最严格意义 SQL Server 计算表中的行数相同的基数。

: 除了基数的谓词选择性也会影响 AutoStats 生成。这意味着该统计信息可能不是更新的 afer 每隔 500 修改基数好像 < 500 或更改的每个 20%的基数好像 > 500。向上因子 (值的范围从 1 到 4、 1 和 4 (含) 之间) 的小数位数生成的具体情况取决于选择性,这一因素的变化获得从算法的数量的乘积为 AutoStats 生成所需的修改的实际数量。

可以将上述算法 summarised 表的窗体中:
_________________________________________________________________________________
 Table Type | Empty Condition | Threshold When Empty |Threshold When Not Empty 
_________________________________________________________________________________
 Permanent  | < 500 rows      | # of Changes >= 500  | # of Changes >= 500 + (20% of Cardinality)
___________________________________________________________________________
 Temporary  | < 6 rows        | # of Changes >= 6    | # of Changes >= 500 + (20% of Cardinality)
___________________________________________________________________________
Table
Variables   | Change in cardinality does not affect AutoStats generation.
___________________________________________________________________________
的下面是两个示例,帮助说明这一概念:

示例 1

请考虑在 pubs 为数据库包含 23 行,并具有两个索引中的作者表。唯一的聚集的索引 UPKCL_auidind,将索引上单列 au_id,而 au_lname 和 au_fname 列上创建了一个复合非聚集的索引 aunmind。由于此表格中包含少于 500 的行 AutoStat 将开始之后发生 500 更改表格中的数据。所做的更改可以是 500 的一个或多个插入、 删除、 更改为一个索引的列,如 au_lname,或以及它们的任何组合。

因此,可以,预测时将通过监视将在每个更新时递增该 sysindexes.rowmodctr 值启动更新统计信息。当它达到或超过 500 时,可能会启动更新统计信息。

示例 2

请考虑一个第二个表 t2,具有 1,000 元的基数。对于大于 500 的行的表 SQL Server 将更新统计信息时 (500 + 20%) 进行了更改。数学,20%是 1,000 的 200 的操作,因此您可以期望看到 AutoStat 后对表进行了大约 700 修改启动。

自动化 Autostats 确定

若要实现的 AutoStat 将运行时确定的自动化可以轮询 sysindexes 表,标识时进行表的修改会到达起始点。以下是使用基本的算法来执行此操作:
   if (sysindexes.rows > 500)
      if (sysindexes.rows * 0.20 >= sysindexes.rowmodctr && production
      hours) //500 change leeway
         begin
            disable autostats
            log autostats disable
         end
      else
         begin
            stats ok
         end
   else
      if (sysindexes.rowmodctr >= 425) //75 change leeway
         begin
            disable autostats
            log autostats disable
         end
				

以后您可以执行以下对作业进行计划:
  • 运行更新统计信息对您被迫禁用它们在一天的所有表。

    -并且-
  • 因为每个表的修改计数器将已重置为 0 时运行的更新统计信息,请重新启用 AutoStat。

控制是否对表运行更新统计信息

此的问题最明显的解决方案时 AutoStat 公认 Problematic,是禁用从而使数据库管理员可用来在不太令人讨厌的时间内安排更新统计信息的自动统计生成。可以执行此操作可以通过使用更新统计信息语句或存储的 sp_autostats 过程。更新统计信息语句的语法是:
   UPDATE STATISTICS <table>...with NORECOMPUTE
				

sp_autostats 存储过程的语法是:
sp_autostats <table_name>,<stats_flag>,<index_name>
其中 <stats_flag> 是"打开"或"关闭"。

若要禁用自动更新统计信息或每个数据库级别上的创建统计信息的发生,还可以使用 sp_dboption:
sp_dboption <dbname>,自动更新统计 < 上 | 关闭 >

-或者-

sp_dboption <dbname>,自动创建统计信息,< 上 | 关闭 >

控制并发更新统计信息的进程数

当前,充足的特定表时禁用 AutoStat,它是不可能配置正在同时运行的自动更新统计信息语句的数量 (对于此已归档 DCR 51539)。服务器不会但是,限制每个处理器的四个的并发更新统计信息进程的数目。

确定 Autostats 的运行时

使用跟踪标记 205 可以依赖于统计信息的存储的过程 AutoStat 的结果被重新编译时报告。此跟踪标记将写入错误日志以下消息:
重新编译颁发 1998年-10-15 11:10:51.98 spid9: ProcName: sp_helpindex
LineNo: 75 StmtNo: 29
如果启用了跟踪标志 205,下面的消息也将括号 AutoStat 消息从 8721 更新统计信息时。可以通过 RowModCnt 为值将大于 0 的区分中括号中的打开条消息。右括号后,更新统计信息将具有 RowModCnt 值为 0:
1998-10-15 11:38:43.68 spid8 架构更改: 表 Dbid: 7 Objid:
133575514 RowModCnt: 60500 RowModLimit: 60499
此消息,"RowModCnt"是对表所做的修改的总数。"RowModLimit"是阈值的超出时, 导致为表的更新统计信息语句执行。

也可能是以启用跟踪标记 8721,AutoStat 都已运行时,将转储到错误日志的信息。以下是消息的您可以期望看到类型的一个示例:
1998-10-14 16:22:13.21 spid13 AUTOSTATS: 更新表: [作者]
行数: 23 模式: 501 绑定: 500 工期: 47ms UpdCount: 2
此消息,"模块"是对表所做的修改的总数。 "绑定"是修改阈值、"工期"是更新统计信息语句完成,所需的时间量和"UpdCount"是更新的统计信息的计数。

您还可以使用 SQL Server 事件探查器来确定何时更新统计信息语句正在运行。要执行此操作执行以下步骤:
  1. 事件探查器 菜单上单击 工具,然后单击 选项
  2. 常规 选项卡上转到 事件,然后选择 全部事件类
  3. 定义一个新的跟踪并在 事件,下选择 杂项,请选择 自动更新统计 sub-event 一次。
注: 如果正在通过 AutoStat 更新很多的统计信息,大量的邮件可以被写入错误日志。在任何生产或否则为关键服务器上使用它们之前彻底试验这些跟踪标志。

架构锁

SQL Server 采用了两种类型的这两种执行时它将更新表的统计信息的架构锁:
   Sch-S: Schema Stability Lock
   ----------------------------
   This lock ensures that a schema element, such as a table or index, will
   not be dropped while any session holds a schema stability lock on the
   schema element.

   Sch-M-UPD-STATS: Schema Modification Lock
   -----------------------------------------
   This is a non-blocking lock that is used by the system to ensure that
   only one automatic UPDATE STATISTICS process is run against a table at
   any given point in time. The sp_lock stored procedure will report this
   lock has having a type = TAB, resouce = UPD-STATS and mode = SCH-M.
				
通过运行 sp_lock 或 syslockinfo 表中选择,可查看这些锁。

属性

文章编号: 195565 - 最后修改: 2007年11月2日 - 修订: 7.6
这篇文章中的信息适用于:
  • Microsoft SQL Server 7.0 标准版
  • Microsoft SQL Server 2000 Developer Edition
  • Microsoft SQL Server 2000 标准版
  • Microsoft SQL Server 2000 Enterprise Edition
  • Microsoft SQL Server 2000 Personal Edition
  • Microsoft SQL Server 2000 Workgroup Edition
  • Microsoft SQL Server 2000 Desktop Engine (Windows)
  • Microsoft SQL Server 2000 Enterprise Edition 64-bit
关键字:?
kbmt kbinfo KB195565 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 195565
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com