自动异步更新统计信息配置

Microsoft.SQLServer.2012.Database.Configuration.AutoUpdateStatAsync (UnitMonitor)

监视数据库的自动异步更新统计信息设置

Knowledge Base article:

摘要

此监视器检查此数据库的“自动异步更新统计信息”设置。因为此监视器是整体标准要求的一部分,如果该设置不符合指定的标准,将生成警报。

配置

“自动异步更新统计信息”设置为 ON 时,针对 AUTO_UPDATE_STATISTICS 选项的统计信息更新是异步的。查询优化器不等待统计信息更新完成即编译查询。除非已将 AUTO_UPDATE_STATISTICS 设置为 ON,否则将此选项设置为 ON 不会产生任何影响。

AUTO_UPDATE_STATISTICS_ASYNC {ON | OFF}

原因

如果该选项与所需的设置不匹配,将生成一个警告警报。在初始状态下,监视器配置为在此设置为 "ON" 时发出警报。

此数据库选项默认为 OFF 的原因是为了与现有应用程序保持向后兼容性。因为对于统计信息更新,查询不等待或阻塞,所以,如果某个查询使用旧的统计信息编译和运行,性能可能会暂时发生变化。在统计信息完成更新后,在下一次运行前,将对更新的统计信息重新编译相同的查询。但在统计信息正在更新时,查询可能存在暂时性的性能问题,因为已根据旧的统计信息对其进行了编译。

对于大多数应用程序而言,异步更新可能是最佳选择,因为它在整体上将阻塞和等待时间降至最低。请考虑将其设为 ON;如果它适用于您的应用程序,则禁用此单元监视器。

解决方法

可以通过以下任一方法解决此问题:

或者,如果对于此数据库无需考虑此监视器:

外部

请参阅有关此设置的详细信息: ALTER DATABASE SET 选项(Transact-SQL)

另请参阅“ 使用统计信息提高查询性能

可替代参数

名称

说明

默认值

警报优先级

定义警报优先级。

正常

警报严重性

定义警报严重性。

警告

禁用对 SQL Express 的检查

启用或禁用对 SQL Express 版本的检查。

已启用

启用或禁用工作流。

预期值

若要查看可能的值的集合,请参阅有关此监视器的知识的“配置”部分。

生成警报

定义工作流是否生成警报。

间隔(秒)

要运行工作流的重复时间间隔(秒)。

43200

超时(秒)

指定允许工作流在被关闭并标记为失败之前运行的时间。

300

Element properties:

TargetMicrosoft.SQLServer.2012.Database
Parent MonitorMicrosoft.SQLServer.2012.Database.AutomaticConfiguration
CategoryConfigurationHealth
EnabledFalse
Alert GenerateTrue
Alert SeverityWarning
Alert PriorityNormal
Alert Auto ResolveTrue
Monitor TypeMicrosoft.SQLServer.2012.DBConfigurationStatus
RemotableTrue
AccessibilityPublic
Alert Message
自动异步更新统计信息配置错误
未根据最佳实践设置计算机“{2}”上 SQL 实例“{1}”中的数据库“{0}”的自动异步更新统计信息设置。
RunAsDefault

Source Code:

<UnitMonitor ID="Microsoft.SQLServer.2012.Database.Configuration.AutoUpdateStatAsync" Accessibility="Public" Enabled="false" Target="SQL2012Core!Microsoft.SQLServer.2012.Database" ParentMonitorID="Microsoft.SQLServer.2012.Database.AutomaticConfiguration" Remotable="true" Priority="Normal" TypeID="Microsoft.SQLServer.2012.DBConfigurationStatus" ConfirmDelivery="false">
<Category>ConfigurationHealth</Category>
<AlertSettings AlertMessage="Microsoft.SQLServer.2012.Database.Configuration.AutoUpdateStatAsync.AlertMessage">
<AlertOnState>Warning</AlertOnState>
<AutoResolve>true</AutoResolve>
<AlertPriority>Normal</AlertPriority>
<AlertSeverity>Warning</AlertSeverity>
<AlertParameters>
<AlertParameter1>$Target/Property[Type="SQL!Microsoft.SQLServer.Database"]/DatabaseName$</AlertParameter1>
<AlertParameter2>$Target/Host/Property[Type="SQL!Microsoft.SQLServer.ServerRole"]/InstanceName$</AlertParameter2>
<AlertParameter3>$Target/Host/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</AlertParameter3>
</AlertParameters>
</AlertSettings>
<OperationalStates>
<OperationalState ID="ConfigurationValueOK" MonitorTypeStateID="ConfigurationValueOK" HealthState="Success"/>
<OperationalState ID="ConfigurationValueNotOK" MonitorTypeStateID="ConfigurationValueNotOK" HealthState="Warning"/>
</OperationalStates>
<Configuration>
<ConnectionString>$Target/Host/Property[Type="SQL!Microsoft.SQLServer.DBEngine"]/ConnectionString$</ConnectionString>
<DatabaseName>$Target/Property[Type="SQL!Microsoft.SQLServer.Database"]/DatabaseName$</DatabaseName>
<IntervalSeconds>43200</IntervalSeconds>
<SyncTime/>
<ConfigValue>AutoUpdateAsyncStat</ConfigValue>
<ExpectedValue>OFF</ExpectedValue>
<ExcludeOnExpress>false</ExcludeOnExpress>
<SQLSKU>$Target/Host/Property[Type="SQL!Microsoft.SQLServer.DBEngine"]/Edition$</SQLSKU>
<TimeoutSeconds>300</TimeoutSeconds>
</Configuration>
</UnitMonitor>