【译】SQLskills SQL101:Trace Flags、ERRORLOG、Update Statistics

最近阅读SQLskills SQL101,将Erin Stellato部分稍作整理。仅提取自己感兴趣的知识点,详细内容请阅读原文。



一、Trace Flags
推荐开启三个跟踪标记1118、3023、3226
跟踪标记1118(适用2016之前版本),避开对SGAM页的使用,在统一区分配新建对象的空间。
跟踪标记3023(适用2014之前版本),在默认情况下对实例上进行的所有备份启用CHECKSUM选项。
跟踪标记3226,成功备份信息不再写入SQL Server ERRORLOG
二、The SQL Server ERRORLOG
1、设定作业定期recycle错误日志(weekly)
EXEC sp_cycle_errorlog
2、配置SQL Server 错误日志文件在回收之前的数目(30)
SSMS->实例->管理->SQL Server 日志->配置
三、Updating SQL Server Statistics Part I – Automatic Updates
为了自动更新统计信息,必须为数据库启用[自动更新统计信息]数据库选项
可以使用以下语句检查[自动更新统计信息]选项是否启用

SELECT
    [name] [DatabaseName],
    CASE
        WHEN [is_auto_update_stats_on] = 1 THEN ‘Enabled‘
        ELSE ‘Disabled‘
    END [AutoUpdateStats]
FROM [sys].[databases]
ORDER BY [name];
GO

使用以下语句启用[自动更新统计信息]选项

USE [master]
GO
ALTER DATABASE [<database_name>] SET AUTO_UPDATE_STATISTICS ON WITH NO_WAIT
GO

启用选项后,SQL Server根据内部阈值将统计信息标记为过期:
对于SQL Server 2014及之前版本,阈值是500+(20%×表格数据总量)。当然也有例外(数据量小于500行的表格,表变量上不能建统计信息)
对于SQL Server 2008 R2 SP1及之后版本,可以使用跟踪标记2371降低这个阈值
对于SQL Server 2016,如果数据库的兼容级别为130,默认使用跟踪标志2371引入的阈值;如果数据库的兼容级别<=120,则需使用跟踪标记2371来降低阈值
如果统计信息被标记为过时,那么在下一次使用的时候,SQL Server将自动更新它们。注意,它们并不是在过期的时刻就更新,它们在需要的时候才会更新。
四、Updating SQL Server Statistics Part II – Scheduled Updates
4.1、Update Statistics Task
维护计划中的"更新统计信息"任务,你可以配置所有数据库或者特定数据库,你还可以确定更新选项(所有、列统计、索引统计),扫描类型(完全、按行数抽样、按百分比抽样)

/* Update Statistics Task 对应的脚本(截取部分) */
--所有现有统计信息,完全扫描
USE [AdventureWorks2008R2]
GO
UPDATE STATISTICS [dbo].[ErrorLog]
WITH FULLSCAN
GO
--仅限列统计信息,按行数抽样
USE [AdventureWorks2008R2]
GO
UPDATE STATISTICS [dbo].[ErrorLog]
WITH SAMPLE 50 ROWS,COLUMNS
GO
--仅限索引统计信息,按百分比抽样
USE [AdventureWorks2008R2]
GO
UPDATE STATISTICS [dbo].[ErrorLog]
WITH SAMPLE 50 PERCENT,INDEX
GO

经常有人在Rebuild Index Task之后添加Update Statistics Task。如果是在SQL Server 2014及之前的版本,你只需要更新列统计信息即可,因为Rebuild Index Task会Rebuild所有的索引,并且使用完全扫描更新统计信息。在SQL Server 2016,Rebuild Index Task提供更多选项,你可以配置当索引碎片达到指定数值时才Rebuild索引。这样部分索引Rebuild(统计信息更新),部分索引未Rebuild(统计信息没更新)。Update Statistics Task应该如何配置?这种情况你可能选择更新所有现有统计信息,部分统计信息会再次更新——真是浪费!
4.2、sp_updatestats
sp_updatestats命令用于数据库级别,它不能指定统计或者索引或者表。只要数据发生变化,sp_updatestats命令就会更新统计信息

/* sp_updatestats 测试 */
USE AdventureWorks2008R2
GO
--执行命令
exec sp_updatestats
......
正在更新 [Sales].[SalesOrderDetail]
    [PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID],不需要更新...
    [AK_SalesOrderDetail_rowguid],不需要更新...
    [IX_SalesOrderDetail_ProductID],不需要更新...
    [_WA_Sys_00000006_3587F3E0],不需要更新...
    [_WA_Sys_00000002_3587F3E0],不需要更新...
    [_WA_Sys_00000004_3587F3E0],不需要更新...
    [_WA_Sys_00000007_3587F3E0],不需要更新...
    [_WA_Sys_0000000B_3587F3E0],不需要更新...
    已更新 0 条索引/统计信息,8 不需要更新。
......
--查看统计更新时间
DBCC SHOW_STATISTICS (‘Sales.SalesOrderDetail‘,IX_SalesOrderDetail_ProductID)
Name    Updated
IX_SalesOrderDetail_ProductID    08 16 2017  4:30PM

--更新一行数据
UPDATE Sales.SalesOrderDetail
SET ProductID = ProductID
WHERE SalesOrderDetailID=1

--执行命令
exec sp_updatestats
......
正在更新 [Sales].[SalesOrderDetail]
    [PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID],不需要更新...
    [AK_SalesOrderDetail_rowguid],不需要更新...
    [IX_SalesOrderDetail_ProductID] 已更新...
    [_WA_Sys_00000006_3587F3E0],不需要更新...
    [_WA_Sys_00000002_3587F3E0],不需要更新...
    [_WA_Sys_00000004_3587F3E0],不需要更新...
    [_WA_Sys_00000007_3587F3E0],不需要更新...
    [_WA_Sys_0000000B_3587F3E0],不需要更新...
    已更新 1 条索引/统计信息,7 不需要更新。
......
--查看统计更新时间
DBCC SHOW_STATISTICS (‘Sales.SalesOrderDetail‘,IX_SalesOrderDetail_ProductID)
Name    Updated
IX_SalesOrderDetail_ProductID    08 16 2017  4:32PM

可以看到哪怕只是更新一行,统计信息也会更新!显然这种更新统计没太大意义。
4.3、UPDATE STATISTICS
UPDATE STATISTICS命令可以针对单个统计信息或者单个表(更新表上的所有统计信息)。推荐使用此命令编写更新统计信息语句,我喜欢根据已经更改的数据量更新过时的统计信息。
我们通过使用sys.dm_db_stats_properties来确定是否更新统计信息。这个动态管理函数跟踪修改,并且告诉我们在上一次更新统计信息时表中有多少行,以及统计更新的时间,以及上一次更新统计信息后累计变更的行数。例如,我更新Sales.SalesOrderDetail表中的部分行,然后查看此DMF输出,你可以看到modification_counter和我修改的行数一致

/* UPDATE STATISTICS 测试 */
USE [AdventureWorks2008R2];
GO
--更新部分行,9831行受影响
UPDATE [Sales].[SalesOrderDetail]
SET [ProductID] = [ProductID]
WHERE [ProductID] IN (921,873,712);
GO
--从sys.dm_db_stats_properties中查看上次统计更新信息
SELECT [so].[name] [TableName],
       [ss].[name] [StatisticName],
       [ss].[stats_id] [StatisticID],
       [sp].[last_updated] [LastUpdated],
       [sp].[rows] [RowsInTableWhenUpdated],
       [sp].[rows_sampled] [RowsSampled],
       [sp].[modification_counter] [NumberOfModifications]
FROM   [sys].[stats] [ss]
       JOIN [sys].[objects] [so]
            ON  [ss].[object_id] = [so].[object_id]
       CROSS APPLY [sys].[dm_db_stats_properties] ([so].[object_id], [ss].stats_id) [sp]
WHERE  [so].[name] = N‘SalesOrderDetail‘;
GO


连接执行三次更新,受影响行数累计达到9831*3=29493>24763=121317*20%+500,[自动更新统计信息]选项为True,下一次使用索引时就会触发更新统计信息。
有了上面的数据后,我们可以根据已修改行数所占比例决定是否更新统计信息。很有可能一些统计信息需要每天更新,因为数据变化很大,而其他统计信息只需要每周更新一次或每月更新一次,因为数据变化不大。
无论你使用哪种方式手动更新统计信息,确保通过代理作业定期执行,同时确保已启用[自动更新统计信息]选项。谁也不能保证作业始终正常执行,同时也无法保证作业异常时能及时通知你。

时间: 2024-10-05 04:51:45

【译】SQLskills SQL101:Trace Flags、ERRORLOG、Update Statistics的相关文章

HOW TO CHECK FOR ACTIVE TRACE FLAGS ON MICROSOFT SQL SERVER

http://crashmag.net/how-to-check-for-active-trace-flags-on-microsoft-sql-server You check for active trace flags by running the following query. They may be global or they may be session based. Checking for active trace flags DBCC TRACESTATUS The out

Update Statistics用法

Update Statistics语句的作用将创建的数据库表的有关统计信息更新到系统 sysmater的相关表中,以便查询优化器选择最佳的执行路径,当sysmaster库中没有相应的统计信息,或者统计不准确时,优化器会进行大量的顺序扫描,产生严重的性能问题 因此如果重新装载数据或者对表进行大量的更新操作后,及时使用 Update statistics分三个级别:update statistics low:只更新表 字段 记录数 页数 和索引等基本信息 对字段的分布情况不做统计 语法说明:(1)u

The Accidental DBA:Troubleshooting

最近重新翻看The Accidental DBA,将Troubleshooting部分稍作整理,方便以后查阅.此篇是Part 3Part 1:The Accidental DBA:SQL Server BackupPart 2:The Accidental DBA:Troubleshooting Performance一.Wait Statistics Analysis当SQL Server执行一项任务,如果它需要等待(页面释放锁.从磁盘读取页面到内存.事务日志写入),SQL Server会记录

《Pro SQL Server Internals, 2nd edition》的CHAPTER 3 Statistics中的Introduction to SQL Server Statistics、Statistics and Execution Plans、Statistics Maintenance(译)

<Pro SQL Server Internals> 作者: Dmitri Korotkevitch 出版社: Apress出版年: 2016-12-29页数: 804定价: USD 59.99装帧: PaperbackISBN: 9781484219638 统计 SQL Server查询优化器在为查询选择执行计划时使用基于成本的模型.它估计不同执行计划的成本,并选择成本最低的一个.但是,请记住,SQL Server并不搜索查询可用的最佳执行计划,因为评估所有可能的替代方案在CPU方面都是耗时

非常全面的SQL Server巡检脚本来自sqlskills团队的Glenn Berry 大牛

-- SQL Server 2012 Diagnostic Information Queries -- Glenn Berry -- April 2015 -- Last Modified: April 27, 2015 -- http://sqlserverperformance.wordpress.com/ -- http://sqlskills.com/blogs/glenn/ -- Twitter: GlennAlanBerry -- Please listen to my Plura

Oracle 11g trace events

oracle的events,是我们在做自己的软件系统时可以借鉴的 Oracle 11g trace eventsORA-10001: control file crash event1ORA-10002: control file crash event2ORA-10003: control file crash event3ORA-10004: block recovery testing - internal errorORA-10005: trace latch operations fo

SQL Server 统计信息(Statistics)-概念,原理,应用,维护

前言:统计信息作为sql server优化器生成执行计划的重要参考,需要数据库开发人员,数据库管理员对其有一定的理解,从而合理高效的应用,管理. 第一部分 概念 统计信息(statistics):描述某个(些)栏位,索引的数据分布情况.优化器用其评估生成高效执行计划. 密度(density):一个比率值,显示在一个(组)列中有多少唯一值.(实际应用中值越小越好) Density = 1 / Number of distinct values for column(s) 直方图(histogram

SQL SERVER 统计信息概述(Statistics)

前言 查询优化器使用统计信息来创建可提高查询性能的查询计划,对于大多数查询,查询优化器已经为高质量查询计划生成必要的统计信息,但是在少数情况下,您需要创建附加的统计信息或者修改查询设计以得到最佳结果.因此理解和合理使用统计信息是数据库优化的方式之一.   统计信息的分类 根据创建源的不同,统计信息分为两种表统计信息和索引统计信息,除非你自定义它们,否则它们之间没有本质的区别. 索引统计信息建立在索引上面,因此对于创建已经存在的数据上,在创建索引的时候会扫描全部数据,这些数据也会创建在索引的统计信

SQL Server 的 Statistics 簡介

當你要清空「資料表(table)」,或倒入大量「資料(data;record)」,或公司「資料庫(database)」改用新版本要資料大搬家…等情形,不只是要重建「索引(index)」,還應要重建或更新「統計(statistics)」.「統計」的正確與否,直接牽動 SQL Server 的「效能(performance)」.沒有「統計」固然不好,「統計」若過時,會讓最佳化程式做出錯誤的決定則更糟. SQL Server 的查詢最佳化程式,會用索引的「統計」,來獲得它所需要的「資訊(informa