原文:第十二章——SQLServer统计信息(1)——创建和更新统计信息

简介:

查询的统计信息:

目前为止,已经介绍了选择索引、维护索引。如果有合适的索引并实时更新统计信息,那么优化器会选择有用的索引供查询之用,因为SQLServer优化器是基于开销的优化。当在where和on上的列上的数据需要显示在结果集的时候,如果有实时的统计信息,优化器会选择最好的执行方式,因为优化器会从统计信息中获得这些数据的明细情况。

在创建索引的时候,SQLServer就会在索引列上创建统计信息。简单来说,统计信息就是索引或者列上能够描述数据分布的数据。

查询选择性:

公式:列上不重复数据的总数/列上的数据总数

选择性越高,索引性能越好,当上述公式的值为1时,可以用于做为主键或者唯一键。

创建和更新统计信息:

统计信息有助于SQLServer优化引擎选择合适的索引及相关操作用于执行SELECT语句。有两个方式创建和更新统计信息:

1、  手动创建和更新统计信息

2、  自动创建和更新统计信息

准备工作:

在开始之前,先来看看如何查找数据库的当前统计信息设置:

  1. SELECT CASE WHEN DATABASEPROPERTYEX('master', 'IsAutoCreateStatistics') = 1
  2. THEN 'Yes'
  3. ELSE 'No'
  4. END AS 'IsAutoCreateStatistics?' ,
  5. CASE WHEN DATABASEPROPERTYEX('Master', 'IsAutoUpdateStatistics') = 1
  6. THEN 'Yes'
  7. ELSE 'No'
  8. END AS 'IsAutoUpdateStatistics?' ,
  9. CASE WHEN DATABASEPROPERTYEX('Master', 'Is_Auto_Update_stats_async_on') = 1
  10. THEN 'Yes'
  11. ELSE 'No'
  12. END AS 'IsAutoUpdateStatsaAyncOn?'
  13. GO

下面的语句用于显示where子句中的数据库或者表的统计信息情况:

  1. SELECT object_id ,
  2.  
  3. OBJECT_NAME(object_id) AS TableName ,
  4.  
  5. name AS StatisticsName ,
  6.  
  7. auto_created
  8.  
  9. FROM sys.stats
  10.  
  11. --where object_id=OBJECT_ID('Sales.SalesOrderHeader')
  12.  
  13. ORDER BY object_id DESC
  14.  
  15. GO

还可以使用以下方式查看:

  1. sp_helpstats 'Sales.SalesOrderHeader'

步骤:

1、  现在开始来看看创建和更新统计信息的不同方式,在数据库级别,有一个选项,默认为ON,这个选项是:Auto_Create_Statistics:

  1. ALTER DATABASE AdventureWorks SET AUTO_CREATE_STATISTICS ON

2、  启用同步创建列上统计信息的选项,Auto_Create_Statistics,当执行一个查询一个精确数据量的数据时,优化引擎会在这个列上创建一个柱状图表。由SQLServer创建的统计信息以_WA开头,可以看看这些列表:

  1. SELECT st.name AS StatName ,
  2.  
  3. COL_NAME(stc.object_id, stc.column_id) AS ColumnName ,
  4.  
  5. OBJECT_NAME(st.object_id) AS TableName
  6.  
  7. FROM sys.stats AS st
  8.  
  9. INNER JOIN sys.stats_columns AS stc ON st.object_id = stc.object_id
  10.  
  11. AND st.stats_id = stc.stats_id
  12.  
  13. WHERE st.name LIKE '_WA%'

3、  上面的统计信息不会因为Auto_Create_Statistics选项设为ON而结束。这些是强制你的统计信息更新以保证性能优秀。这个只是定义你的统计信息是否同步更新。默认情况下这个选项是为ON的。但是有时候不一定符合你的要求,此时可以使用手动更新计划:

  1. ALTER DATABASE AdventureWorks SET AUTO_UPDATE_STATISTICS ON

4、  Auto_Update_Statistics选项会在创建索引时、通过Auto_Create_Statistics或者用户使用CREATE STATISTICS命令手动创建统计信息时自动更新统计信息,下面命令使用异步方式更新统计信息:

  1. ALTER DATABASE AdventureWorks SET AUTO_UPDATE_STATISTICS_ASYNC ON

5、  此时来看看执行上面语句后的数据库统计信息配置情况:

  1. SELECT is_auto_update_stats_async_on ,
  2.  
  3. is_auto_create_stats_on ,
  4.  
  5. is_auto_update_stats_on
  6.  
  7. FROM sys.databases
  8.  
  9. WHERE name = 'AdventureWorks'

6、  上面的方式均为自动创建和更新统计信息,现在来看看如何手动实现:

  1. --创建统计信息在Sales.SalesOrderHeader表的DueDate列上
  2.  
  3. CREATE STATISTICS st_DueDate_SalesOrderHeader ON Sales.SalesOrderHeader(DueDate)
  4.  
  5. GO
  6.  
  7. --更新Sales.SalesOrderHeader表的全部统计信息
  8.  
  9. UPDATE STATISTICS Sales.SalesOrderHeader
  10.  
  11. GO
  12.  
  13. --更新Sales.SalesOrderHeader表的st_DueDate_SalesOrderHeader统计信息
  14.  
  15. UPDATE STATISTICS Sales.SalesOrderHeader st_DueDate_SalesOrderHeader
  16.  
  17. GO
  18.  
  19. --更新数据库中所有可用的统计信息
  20.  
  21. EXEC sys.sp_updatestats
  22.  
  23. GO
  24.  
  25. --手动删除统计信息
  26.  
  27. DROP STATISTICS Sales.SalesOrderHeader.st_DueDate_SalesOrderHeader
  28.  
  29. GO

分析:

当索引创建时,优化器会创建统计信息到索引列所在的表或者视图上,除此之外,如果对Auto_Create_Statistics选项设置了ON,优化器会创建一个单列统计信息,及时它没有出现在查询的所需列上。如果你觉得一些查询性能有问题,检查所有谓词,如果这些列缺失了统计信息,你可以手动增加,有时候,DTA(数据库优化顾问)也会建议你创建统计信息。

一般情况下,在查询编译之前,如果开启了同步更新统计信息,SQLServer如果发现统计信息过时,会引发更新统计信息的操作,然后你的查询就会使用上实时的统计信息。而这个操作会阻塞查询,知道更新结束,但是不会保留这些查询,它会更新统计信息以便下次运行查询的时候可以使用上较新的统计信息。

扩充知识:

默认情况下,只有sysadmin/db_owner/对象的创建者这三种角色的成员才有权限创建和更新统计信息。

柱状图:

柱状图是一类由SQLServer为了统计信息而生成的表。可以认为是一个显示对应列上统计信息最大和最小值范围的报表。

第十二章——SQLServer统计信息(1)——创建和更新统计信息的更多相关文章

  1. 第十二章——SQLServer统计信息(4)——在过滤索引上的统计信息

    原文:第十二章--SQLServer统计信息(4)--在过滤索引上的统计信息 前言: 从2008开始,引入了一个增强非聚集索引的新功能--过滤索引(filter index),可以使用带有where条 ...

  2. 第十二章——SQLServer统计信息(3)——发现过期统计信息并处理

    原文:第十二章--SQLServer统计信息(3)--发现过期统计信息并处理 前言: 统计信息是关于谓词中的数据分布的主要信息源,如果不知道具体的数据分布,优化器不能获得预估的数据集,从而不能统计需要 ...

  3. 第十二章——SQLServer统计信息(2)——非索引键上统计信息的影响

    原文:第十二章--SQLServer统计信息(2)--非索引键上统计信息的影响 前言: 索引对性能方面总是扮演着一个重要的角色,实际上,查询优化器首先检查谓词上的统计信息,然后才决定用什么索引.一般情 ...

  4. 20190925 On Java8 第二十二章 枚举

    第二十二章 枚举 基本 enum 特性 创建 enum 时,编译器会为你生成一个相关的类,这个类继承自 Java.lang.Enum. valueOf() 是在 Enum 中定义的 static 方法 ...

  5. 《Linux命令行与shell脚本编程大全》 第二十二章 学习笔记

    第二十二章:使用其他shell 什么是dash shell Debian的dash shell是ash shell的直系后代,ash shell是Unix系统上原来地Bourne shell的简化版本 ...

  6. [CSAPP笔记][第十二章并发编程]

    第十二章 并发编程 如果逻辑控制流在时间上是重叠,那么它们就是并发的(concurrent).这种常见的现象称为并发(concurrency). 硬件异常处理程序,进程和Unix信号处理程序都是大家熟 ...

  7. 进击的Python【第十二章】:mysql介绍与简单操作,sqlachemy介绍与简单应用

    进击的Python[第十二章]:mysql介绍与简单操作,sqlachemy介绍与简单应用 一.数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数 ...

  8. PRML读书会第十二章 Continuous Latent Variables(PCA,Principal Component Analysis,PPCA,核PCA,Autoencoder,非线性流形)

    主讲人 戴玮 (新浪微博: @戴玮_CASIA) Wilbur_中博(1954123) 20:00:49 我今天讲PRML的第十二章,连续隐变量.既然有连续隐变量,一定也有离散隐变量,那么离散隐变量是 ...

  9. sql 入门经典(第五版) Ryan Stephens 学习笔记 (第六,七,八,九,十章,十一章,十二章)

    第六章: 管理数据库事务 事务 是 由第五章 数据操作语言完成的  DML ,是对数据库锁做的一个操作或者修改. 所有事务都有开始和结束 事务可以被保存和撤销 如果事务在中途失败,事务中的任何部分都不 ...

随机推荐

  1. 【转】.net IL 指令解释速查

    名称 说明 Add 将两个值相加并将结果推送到计算堆栈上. Add.Ovf 将两个整数相加,执行溢出检查,并且将结果推送到计算堆栈上. Add.Ovf.Un 将两个无符号整数值相加,执行溢出检查,并且 ...

  2. Linux查看连接数,并发数

    Linux查看连接数,并发数 博客分类: 小记 linux  软连接 ln -s /home/ictfmcg/data/photo /var/jtnd/data/photo tomcat 6的Conn ...

  3. 作为一个.net程序猿,需要掌握这些有点前途的人才,一些开发---Shinepans

    1.基础 C#基础                    参考书目:   <c#入门经典>         <ASP.NET揭秘> IIS  HTML              ...

  4. hdu 5035 概率论

    n服务形式,各服务窗口等候时间指数公布,求所需的等待时间. 解: 相两点:首先,等到轮到他,然后就是送达时间. 潜伏期期望每个表单1/ki(1/ki,宣布预期指数公式).总的等待时间预期1/(求和ki ...

  5. 《Javascript高级程序设计》读书笔记之继承

    1.原型链继承 让构造函数的原型对象等于另一个类型的实例,利用原型让一个引用类型继承另一个引用类型的属性和方法 function SuperType() { this.property=true; } ...

  6. JDBC连接数据库和释放连接

    用久了hibernate现在对于JDBC是怎么实现数据库的连接和释放,所以特地总结下关于JDBC的知识,目的是用于提醒自己很多Java的基础知识需要健全. package com.ssh.action ...

  7. hadoop-1.1.2 在Windows环境下的部署

    1:先安装Cygwin 参考http://blog.csdn.net/wind520/article/details/9223003 2:下载 3:解压在C:\cygwin\hadoop1 4:配置 ...

  8. 重新想象 Windows 8 Store Apps (24) - 文件系统: Application Data 中的文件操作, Package 中的文件操作, 可移动存储中的文件操作

    原文:重新想象 Windows 8 Store Apps (24) - 文件系统: Application Data 中的文件操作, Package 中的文件操作, 可移动存储中的文件操作 [源码下载 ...

  9. 走进C的世界-那些年我们常犯的错---keyword相关

    近期一段时间參加一些面试,发现非常多细节的问题自己已经变得非常模糊了.对一些曾经常常遇到的错误.如今也说不出原因了. 而且在编码过程中也相同犯这些错误. 特别写一个博客来记录这些我们常常遇到的错误.自 ...

  10. SessionA和pplication网上聊天室的网络范例

    login.aspx码,如以下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile=" ...