分析统计<第三篇>

  统计是一组存储为柱状图的信息。柱状图是显示数据落入不通分类中的频率的一种统计结构。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自行创建,所以这是必要的。可以通过分区创建过滤索引并获得统计或创建特定的过滤统计。

时间: 2024-08-19 13:12:27

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

Windows系统CPU内存网络性能统计第四篇 CPU 多核CPU各核使用率C++

分享一下我老师大神的人工智能教程吧.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net 转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/8678396 欢迎关注微博:http://weibo.com/MoreWindows Windows系统CPU内存网络性能统计第四篇 CPU多核CPU各核使用率 C++ http://blog.csdn.ne

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

注意:本文是我们的 PHP 性能分析系列的第三篇,点此阅读 PHP 性能分析第一篇: XHProf & XHGui 介绍 ,或  PHP 性能分析第二篇: 深入研究 XHGui. 在本系列的 第一篇 中,我们介绍了 XHProf .而在 第二篇 中,我们深入研究了 XHGui UI, 现在最后一篇,让我们把 XHProf /XHGui 的知识用到工作中! 性能调优 不用运行的代码才是绝好的代码.其他只是好的代码.所以,性能调优时,最好的选择是首先确保运行尽可能少的代码. OpCode 缓存 首先

认识元数据和IL(上) &lt;第三篇&gt;

说在,开篇之前 很早就有说说Metadata(元数据)和IL(中间语言)的想法了,一直在这篇开始才算脚踏实地的对这两个阶级兄弟投去些细关怀,虽然来得没有<第一回:恩怨情仇:is和as>那么迅速,但是Metadata和IL却是绝对重量级的内容,值得我们在任何时间关注,本文就是开始. 1 引言 你可曾想到,我们的C#代码,编译之后究竟为何物?你可曾认知,我们的可执行程序,运行之时的轨迹究竟为哪般?那么,本文通过对Metadata(元数据)和IL(Intermediate Language, 中间语

SQL Server索引的维护 - 索引碎片、填充因子 &lt;第三篇&gt;

实际上,索引的维护主要包括以下两个方面: 页拆分 碎片 这两个问题都和页密度有关,虽然两者的表现形式在本质上有所区别,但是故障排除工具是一样的,因为处理是相同的. 对于非常小的表(比64KB小得多),一个区中的页面可能属于多余一个的索引或表---这被称为混合区.如果数据库中有太多的小表,混合区帮助SQL Server节约磁盘空间. 随着表(或索引)增长并且请求超过8个页面,SQL Server创建专用于该表(或索引)的区并且从该区中分配页面.这样一个区被称为统一区,它可以为多达8个相同表或索引的

linux程序分析工具介绍(三)——sar

本文要介绍的sar,是linux下用来分析系统本身运行情况的非常有用的工具.我们知道,程序在操作系统上要运行,要关注的点不外乎内存,CPU和IO(包括磁盘IO和网络IO).我们的应用程序在操作系统中运行前,我们需要了解系统当前的内存,cpu和IO的使用状况,还需要明白我们的应用程序运行时自身所需要的内存,cpu和IO资源的情况.只有操作系统剩余的内存,cpu和IO资源能够满足应用程序所需要的,才能保证应用程序在操作系统中正常的运行.sar就是用来帮助我们了解操作系统当前内存,cpu和IO等资源的

HttpApplication处理对象与HttpModule处理模块 (第三篇)

一.HttpApplication对象简述 在HttpRuntime创建了HttpContext对象之后,HttpRuntime将随后创建一个用于处理请求的对象,这个对象的类型为HttpApplication. HttpRuntime管理一个定义在System.Web命名空间下的HttpApplicationFactory类的时候,HttpApplicationFactory通过工厂模式管理HttpApplication对象.在HttpApplicationFactory内部维护了一个HttpA

ORA-38760: This database instance failed to turn on flashback database 第三篇

ORA-38760: This database instance failed to turn on flashback database  第三篇 第一篇 第二篇 问题现象: 在数据库alert告警日志中看见例如以下信息: Completed: ALTER DATABASE MOUNT Wed Nov 19 04:57:28 2014 alter database open Errors in file /DBSoft/diag/rdbms/woo/woo/trace/woo_ora_593

跃居AppStore榜首的游戏&lt;别踩到白块儿&gt;源代码分析和下载(第一篇)----它怎么也能爆红?

AppStore和Android市场情况 莫名其妙爆红的游戏 真的莫名其妙,笔者下这个游戏两次,第一次在豌豆荚排行榜看到这款游戏,名字怪怪的,下载下来尝试一下,没觉得有什么新颖的,还在思虑这是不是刷榜刷上去的,果断卸载了:周末的时候逛逛app store,突然看到排行榜首位是Dont Tap The White Tile(后更名panio tiles ),翻译一下不就是别踩到白块儿,笔者震惊了,太莫名其妙了,这东西是真的火,不是刷榜刷出来的!游戏玩家们心理真的难以捉摸,又捧红了一款游戏: 近期爆

ServiceStack.Redis之IRedisClient&lt;第三篇&gt;

事实上,IRedisClient里面的很多方法,其实就是Redis的命令名.只要对Redis的命令熟悉一点就能够非常快速地理解和掌握这些方法,趁着现在对Redis不是特别了解,我也对着命令来了解一下这些方法. 一.属性 IRedisClient的属性如下: 属性 说明 ConnectTimeout  连接超时 Db 当前数据库的ID或下标 DbSize  当前数据库的 key 的数量 HadExceptions    Hashes  存储复杂对象,一个value中有几个field  Host