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


一、Trace Flags
推荐开启三个跟踪标记1118、3023、3226
跟踪标记1118(适用2016之前版本),避开对SGAM页的使用,在统一区分配新建对象的空间。
跟踪标记3023(适用2014之前版本),在默认情况下对实例上进行的所有备份启用CHECKSUM选项。
跟踪标记3226,成功备份信息不再写入SQL Server ERRORLOG

启动参数添加:-T3226
DBCC TRACEON(3226,-1) --第二个参数-1表示实例级别,否则会话级别

二、The SQL Server ERRORLOG
1、设定作业定期recycle错误日志(weekly)
EXEC master..sp_cycle_errorlog
EXEC msdb..sp_cycle_agent_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,下一次使用索引时就会触发更新统计信息。
有了上面的数据后,我们可以根据已修改行数所占比例决定是否更新统计信息。很有可能一些统计信息需要每天更新,因为数据变化很大,而其他统计信息只需要每周更新一次或每月更新一次,因为数据变化不大。
无论你使用哪种方式手动更新统计信息,确保通过代理作业定期执行,同时确保已启用[自动更新统计信息]选项。谁也不能保证作业始终正常执行,同时也无法保证作业异常时能及时通知你。

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

  1. Microsoft SQL Server Trace Flags

    Complete list of Microsoft SQL Server trace flags (585 trace flags) REMEMBER: Be extremely careful w ...

  2. Create STATISTICS,UPDATE STATISTICS

    该命令在一张表或者索引了的视图上更新查询优化统计数字信息. 默认情况下, 查询优化器已经更新了必要的用来提高查询计划的统计信息; 在某些情况下, 你可以通过使用UPDATE STATISTICS 命令 ...

  3. 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 ...

  4. Update Statistics用法

    Update Statistics语句的作用将创建的数据库表的有关统计信息更新到系统 sysmater的相关表中,以便查询优化器选择最佳的执行路径,当sysmaster库中没有相应的统计信息,或者统计 ...

  5. SQL Server ->> SQL Server 2016功能改进之 -- Update Statistics

    1) 以前SQL Server更新一张表/索引的间隔是固定的,创建时更新一次,到了500行时更新第二次,接下来就是呈百分比式的间隔去更新,距离数据修改量达到表的行数量的的20%再次触发更新.但是这样的 ...

  6. Sql Server trace flags

    Tace flag number Description -T1205 每次deadlock算法运行时,都收集相关的信息 -T1204 当deadlock算法发现死锁时才收集相关信息 -T3604 把 ...

  7. 【译】The Accidental DBA:Troubleshooting

    最近重新翻看The Accidental DBA,将Troubleshooting部分稍作整理,方便以后查阅.此篇是Part 3Part 1:The Accidental DBA:SQL Server ...

  8. 《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 ...

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

    非常全面的SQL Server巡检脚本来自sqlskills团队的Glenn Berry 大牛 Glenn Berry 大牛会对这个脚本持续更新 -- SQL Server 2012 Diagnost ...

随机推荐

  1. (改进)Python语言实现词频统计

    需求: 1.设计一个词频统计的程序. 2.英语文章中包含的英语标点符号不计入统计. 3.将统计结果按照单词的出现频率由大到小进行排序. 设计: 1.基本功能和用法会在程序中进行提示. 2.原理是利用分 ...

  2. ORM的详解

    有很多小伙伴都不太理解ORM是什么,其实不用想象的那么复杂.我们先根据3W1H去理解. who:首先ORM可以立即为(Object/Relation Mapping): 对象/关系映射 what:其次 ...

  3. 通信对象 System.ServiceModel.Channels.ServiceChannel 无法用于通信,因为其处于“出错”状态。

    通信对象 System.ServiceModel.Channels.ServiceChannel 无法用于通信,因为其处于“出错”状态. 在 System.ServiceModel.Channels. ...

  4. 【设计模式】——抽象工厂Abstract Factory

    模式意图 提供对象的使用接口,隐藏对象的创建过程. 模式结构 AbstractFactory 提供创建对象的接口. ConcreteFactory 提供真正创建对象的实现类,用于组合并创建不同的对象, ...

  5. gitlab迁移

    1.背景: 操作系统:CentOS Linux release (Core) gitlab版本: 使用rpm包地址:https://mirrors.tuna.tsinghua.edu.cn/gitla ...

  6. 洛谷P2633 Count on a tree(主席树,倍增LCA,树上差分)

    洛谷题目传送门 题目大意 就是给你一棵树,每个点都有点权,每次任意询问两点间路径上点权第k小的值(强制在线). 思路分析 第k小......又是主席树了.但这次变成树了,无法直接维护前缀和. 又是树上 ...

  7. 前端学习 -- Css -- 文本标签

    em和strong - 这两个标签都表示一个强调的内容, em主要表示语气上的强调,em在浏览器中默认使用斜体显示 strong表示强调的内容,比em更强烈,默认使用粗体显示 <!DOCTYPE ...

  8. HDU 4280 Island Transport(网络流,最大流)

    HDU 4280 Island Transport(网络流,最大流) Description In the vast waters far far away, there are many islan ...

  9. 【CF675D】Tree Construction

    题目大意:给定一个有 N 个数组成的序列,在此基础上构建一棵二叉排序树,求每个节点(根节点除外)的父节点的编号是多少. 题解:首先,根据二叉排序树的不稳定性,直接模拟构建二叉排序树肯定会超时,因此需要 ...

  10. C++并发编程之std::future

    简单地说,std::future 可以用来获取异步任务的结果,因此可以把它当成一种简单的线程间同步的手段.std::future 通常由某个 Provider 创建,你可以把 Provider 想象成 ...