最近阅读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. Scrum Meeting NO.3

    Scrum Meeting No.2 1.会议内容 之前的两天无法登录TFS服务器来生成燃尽图,再加上这种方式只能生成当日的燃尽图,我们决定改用excel生成燃尽图.(作为一个渣渣pm,我用了一下午才 ...

  2. 团队博客 Week14

    0. 在吹牛之前,先回答这个问题: 如果你的团队来了一个新队员,有一台全新的机器, 你们是否有一个文档,只要设置了相应的权限,她就可以根据文档,从头开始搭建环境,并成功地把最新.最稳定版本的软件编译出 ...

  3. 《Linux内核设计与实现》Chapter 2 读书笔记

    <Linux内核设计与实现>Chapter 2 读书笔记 一.获取内核源码 1.使用Git 我们曾经在以前的学习中使用过Git方法 $ git clone git://git.kernel ...

  4. opencv2 用imwrite 抽取并保存视频图像帧

    最近在写一个车辆检测程序,程序中需要获取图像帧,并保存为图片,且放到指定目录中去,我在网上查了很多发现都是opencv1的有关操作,没有opencv2的操作,我参考网上的例子,结合着用opencv2新 ...

  5. bing背单词交互流程 - Chongyang Bai

    昨天和travis,钟秋开会确认了bing背单词的手机界面交互流程.我在这里简单描述一下,设计页面暂时不能贴出来,期待大家的宝贵意见 b( ̄▽ ̄)d. 单词本浏览界面:单词本被分为两类,用户单词本和单 ...

  6. centos 6.9安装mysql

    1.确认mysql是否已安装,有下面的代码可知 [root@cdh1 zjl]# yum list installed mysql* Loaded plugins: fastestmirror, re ...

  7. 洛谷P13445 [USACO5.4]奶牛的电信Telecowmunication(网络流)

    题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相 ...

  8. 【设计模式】—— 迭代模式Iterator

    前言:[模式总览]——————————by xingoo 模式意图 提供一个方法按顺序遍历一个集合内的元素,而又不需要暴露该对象的内部表示. 应用场景 1 访问一个聚合的对象,而不需要暴露对象的内部表 ...

  9. oracle 创建表空间 与创建用户与分配用户权限

    创建一个表空间名为ABC create tablespace "ABC"     //貌似要大写 datafile 'D:\oracle\TBSPACES\ABC.dbf'   / ...

  10. 转载:C++中两个类中互相包含对方对象的指针问题

    原文链接:http://www.cnblogs.com/hanxi/archive/2012/07/25/2608068.html 前几天很不爽,因为C++中两个类中互相包含对方对象的指针编译时提示某 ...