统计是一组存储为柱状图的信息。柱状图是显示数据落入不通分类中的频率的一种统计结构。SQL Server存储的柱状图包括多大200行的列和索引键(或多列索引键的第一列)的数据分布采样。在两个连续采样值之间的索引键值范围上的信息被称为步骤。这些步骤由200个存储值之间的不通大小间隔组成。

  一个步骤提供以下信息:

  • 给定步骤的最高值(RANGE_HI_KEY);
  • 等于RANGE_HI_KEY的行数(EQ_ROWS);
  • 前一个最高值和当前最高值之间的行范围,这些样本不计算在内(RANGE_ROWS);
  • 范围中不同行的数量(DISTINCT_RANGE_ROWS),如果范围中所有值都是唯一的,那么RANGE_ROWS等于DISTINCT_RANGE_ROWS;
  • 等于范围内一个键值的平均行数(AVG_RANGE_ROWS);
  当我们在建索引的同时,统计就开始计数。下面我们来创建一张表如下:
  
  其中,第二列column2只有第一行是1,其余1万行全部是2。我们在column2列创建一个索引,然后执行语句:

CREATE NONCLUSTERED INDEX IX_COLUMN2 ON ta1(column2)

DBCC SHOW_STATISTICS(ta1,IX_COLUMN2)

  我们看到统计的信息如下:

  

  下面来运行查询:
   
  我们看到上面两个查询,SQL Server从统计中发现第一个只返回少量的行,因此使用索引更经济。而第二个返回行数过多,不如直接扫描聚集索引。

  除了步骤上的信息,统计中的其他有用信息包括:

  • 最后更新的事件统计;
  • 表中的行数;
  • 平均索引键长度;
  • 柱状图采样行数;
  • 列组合的密度;
  最后更新时间信息能帮助你决定是否应该手工更新统计。平均关键字长度表示索引键列中平均的数据大小,它帮助你了解索引键的宽度,这在确定索引有效性时是重要的指标。

一、密度

  创建执行计划时,查询优化器分析用于过滤器和JOIN子句中的列的统计。具有高选择性的过滤条件将来自表的行数限制在一个小结果集内,并且帮助优化器保持低的查询开销。具有唯一索引的列将有非常高的选择性,因为它可以将匹配行数限制为1。

  另一方面,低选择性的过滤条件将从表中返回一个大的结果集。非常低选择性的过滤条件使列上的非聚集索引变得无效。为大的结果集从非聚集索引导航到基本表通常比直接扫描基本表开销更大,因为非聚集索引相关的书签查找开销太大。

  统计以密度(density)比率的形式跟踪列的选择性。高选择性(或唯一性)的列将有很低的密度。低密度的列(高选择性)适用于非聚集索引,因为它帮助优化器很快地检索少量的行。这也是过滤索引操作的主要依据,因为过滤器的目标是改进索引的选择性或密度。

  密度可以表示为:

密度=1/列中不同值的数量

  密度是0-1之间的数值。列密度越低,越适合于非聚集索引。你可以自己计算来确定索引和统计中列的密度。

  例如上面ta1表中的column2列上的密度

SELECT 1.0/COUNT(DISTINCT Column2) FROM ta1

  

  当然,也可以在DBCC SHOW_STATISTICS的输出中的All density列中看到真实的数据。这个列上的高密度值使其不适合于作为索引,即使是过滤索引也一样。但是,在步骤中维护的该索引键值统计帮助查询优化器使用断言c1=1来使用该索引。

二、多列索引上的统计

  在索引只有一列的情况下,统计包含一个柱状图和该列的一个密度值。有多列的复合索引的统计由仅包含第一列的柱状图和多个密度值组成。这就是在建立符合索引或符合统计时,明智的方法是将更高选择性的列即具有最低密度的列放在第一位的原因。密度值包含第一列和每个索引键列的前缀组合的密度。当WHERE和JOIN子句中断言引用多列时,多个密度值帮助优化器查找符合索引的选择性。尽管第一列能帮助确定柱状图,但是该列本身最后的密度将相同而不管列的顺序。

  修改前面的索引,增加一列:

CREATE NONCLUSTERED INDEX IX_COLUMN2 ON ta1(column2,column1) WITH DROP_EXISTING

  在来看看统计信息:

  

  可以看到,All Density列下有两个密度值:

  • 第1列的密度值;
  • (第1+第2)列的密度;
  对于有3列的多列索引,索引统计还包含(第1+第2+第3)列的密度值。该统计不包含其他任何列组合的密度值。所以,这个索引(IX_Column2)对于只在第2列(column1:假设此列无其他索引)上过滤行不是很有用,因为统计中没有维护column1列单独的密度值。

三、过滤索引上的统计

  过滤索引的目的是改变组成索引的数据,从而改变柱状图和密度使索引性能更好。

  我们在一张Person表上的Name列上建立索引,一万行数据,3000行Name为NULL:
  
  再换一种方式,建立索引的时候过滤掉NULL:
  

  我们看到,组成统计的行数急剧下降,因为有一个过滤器,过滤了3000行,行数当然下降啦。平均关键字长度增加,因为不在处理长度为0的Name。

  密度测量值非常有趣,两个值非常接近,但是过滤后的密度略低,说明更少的唯一值。这是因为过滤后的数据,虽然选择性稍微低一些,但是实际上更精确,消除了对搜索没有贡献的控制。第二个值密度表示聚集索引指针,与Name的单独密度值相同,因为都表示相同的唯一值数量。前一列附加的聚集索引的密度是一个小得多的数值,因为消除了null值而导致的所有不被包含在过滤后的数据的Id唯一值。

  另一个开放的选项是创建过滤索引,这使你能在分区的表上创建更加精细调整过的柱状图。因为统计不会自动在分区表上创建,并且不能使用CREATE STATISTICS自行创建,所以这是必要的。可以通过分区创建过滤索引并获得统计或创建特定的过滤统计。

 
 
 

分析统计<第三篇>的更多相关文章

  1. zz2019年主动学习有哪些进展?答案在这三篇论文里

    2019年主动学习有哪些进展?答案在这三篇论文里 目前推广应用的机器学习方法或模型主要解决分类问题,即给定一组数据(文本.图像.视频等),判断数据类别或将同类数据归类等,训练过程依赖于已标注类别的训练 ...

  2. PHP 性能分析第三篇: 性能调优实战

    注意:本文是我们的 PHP 性能分析系列的第三篇,点此阅读 PHP 性能分析第一篇: XHProf & XHGui 介绍 ,或  PHP 性能分析第二篇: 深入研究 XHGui. 在本系列的 ...

  3. 分析RAC下一个SPFILE整合的三篇文章的文件更改

    大约RAC下一个spfile分析_整理在_2014.4.17 说明:文章来源于网络 第一篇:RAC下SPFILE文件改动 在RAC下spfile位置的改动与单节点环境不全然一致,有些地方须要特别注意, ...

  4. SQLSERVER是怎麽通过索引和统计信息来找到目标数据的(第三篇)

    SQLSERVER是怎麽通过索引和统计信息来找到目标数据的(第三篇) 最近真的没有什么精力写文章,天天加班,为了完成这个系列,硬着头皮上了 再看这篇文章之前请大家先看我之前写的第一篇和第二篇 第一篇: ...

  5. 一年三篇IF大于7的牛人告诉你怎么写SCI

    一年三篇IF大于7的牛人告诉你怎么写SCI 1 研究生必备四本 俗话说好记性不如烂笔头,所以一定要首先养成做笔记的好习惯!作为研究生下面这几个本子是必不可少的: 1.实验记录本(包括试验准备本),这当 ...

  6. python数据挖掘第三篇-垃圾短信文本分类

    数据挖掘第三篇-文本分类 文本分类总体上包括8个步骤.数据探索分析->数据抽取->文本预处理->分词->去除停用词->文本向量化表示->分类器->模型评估.重 ...

  7. Linux进程内存用量分析之堆内存篇

    https://mp.weixin.qq.com/s/a6mLMDinYQGUSaOsGYCEaA 独家|Linux进程内存用量分析之堆内存篇 姬晨烜 58技术 2019-12-06 导语 本文将介绍 ...

  8. 第三篇——第二部分——第二文 计划搭建SQL Server镜像

    原文:第三篇--第二部分--第二文 计划搭建SQL Server镜像 本文紧跟上一章:SQL Server镜像简介 本文出处:http://blog.csdn.net/dba_huangzj/arti ...

  9. 第三篇——第二部分——第六文 监控SQL Server镜像

    原文:第三篇--第二部分--第六文 监控SQL Server镜像 原文出处:http://blog.csdn.net/dba_huangzj/article/details/26846203 要优化, ...

随机推荐

  1. QuickReport多页打印

    You use composite reports for this(TQrCompositeReport) on the quickreports tabTake a look in the Dem ...

  2. Windows进程间通信的各种方法

    原文:Windows进程间通信的各种方法 进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码.数据以及它可利用的系统资源(如文件.管道等)组成.多进程/多线程是Windows操作系 ...

  3. MySQL常用Json函数

    官方文档:JSON Functions Name Description JSON_APPEND() Append data to JSON document JSON_ARRAY() Create ...

  4. 奇葩的SQL*Net more data from client等待,导致批处理巨慢

    <pre name="code" class="sql"><pre name="code" class="sql ...

  5. hdu 5423 Rikka with Tree(dfs)

    Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, so he ...

  6. hdu 1695 GCD(欧拉函数+容斥)

    Problem Description Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD( ...

  7. Android 按二次后退键退出应用程序

    前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net        ...

  8. (LeetCode)两个队列来实现一个栈

    原题例如以下: Implement the following operations of a stack using queues. push(x) -- Push element x onto s ...

  9. python-操作缓存

    参考王智刚同学博客 操作Mmecached 1. 安装API python -m pip install python-memcached 2. 启动memcached memcached -d -u ...

  10. python 安装 memcache

    方式一: python3 -m pip install python-memcached 方式二: pip3 install python-memcached 方式三: tar zxf python- ...