非索引列上的统计

  有时候,可能在连接或过滤条件中的列上没有索引。即使对这种非索引列,如果查询优化器知道这些列的数据分布(统计),它也很可能做出最佳的选择。

  除了索引上的统计,SQL Server可以在没有索引的列上建立统计。即使不是索引列,当你开启了SQL Server自动创建统计功能,SQL Server就自动在执行WHERE、JOIN等查询列上创建统计。数据分布的信息或者特定值出现在非索引列上的可能性,都能够帮助查询优化器确定最优的处理策略。即使查询优化器不能真正使用索引来定位这些列,这也仍然对其有利。如果SQL Server确信这些信息对创建更好的计划有利(这通常发生于这些列被用于一个断言时),则自动在非索引列上创建统计。默认情况下,在非索引列上创建统计是被开启的。它可以通过属性=》选项=》数据库自动创建统计设置来配置。可以使用ALTER DATABASE命令来编程覆盖这个设置。但是,为了更好的性能,建议保持这个特性开启。

  下面来一个实战,以确定这个非索引列的统计也是有用的。首先,建两张表ta1,ta2分别都有十万行数据,但是反差很大,其中ta1的column2中只有一行为1,其余行全部为2。ta2正好相反。在这两个列上都没有索引。

  大致的样子如下:

  

  执行如下SQL语句:

SELECT ta1.column2,ta2.column4
FROM ta1 JOIN ta2
ON ta1.column2 = ta2.column4
WHERE ta1.column2 = 2

  来看执行计划与I/O情况:

  

  

  有对比才能知道哪个更好,假如SQL Server没有统计信息又会如何执行呢?

  我们先执行如下操作:

--关闭自动统计功能
ALTER DATABASE Test SET AUTO_CREATE_STATISTICS OFF--查看ta1表上的统计信息
sp_helpstats 'ta1'
--查看ta2表上的统计信息
sp_helpstats 'ta2'--卸载ta1表上的统计
DROP STATISTICS dbo.ta1._WA_Sys_00000002_0BC6C43E
--卸载ta2表上的统计
DROP STATISTICS ta2._WA_Sys_00000002_0DAF0CB0

  我们再执行相同的语句:

  

  我们看到上面的执行计划有很多的叹号,这是尽职的SQL Server对缺少统计的提示。

  鼠标单击某个有叹号的执行计划:

  

  属性里也给出了提示,再来看看I/O:

  

  各种读都增加了。

  小结:

  保留SQL Server默认的统计信息,但一般情况下不用关心它。除非查询性能变得慢,可以手动更新统计信息。

非索引列上的统计 第二篇相关推荐

  1. MySQL-count(*)、count(1)、count(主键)、count(非索引列)、count(索引列)性能分析

    本文主要讨论的是count()函数在没有where的情况下统计性能 环境: MySQL 数据库5.7.23 服务器4核8G 带宽5M 1000W数据 为防止缓存影响,测试前已经将缓存关闭 一: 先说结 ...

  2. mysql left join 索引失效_MySQL索引列上做操作导致索引失效案例分析

    索引列上做操作导致索引失效 通常我们认为只要建立索引就可以万事大吉,以为只要建立就一定会使用到,可其实在索引列上的计算.函数.类型转换都可能导致索引失效,所以我们不仅要会创建索引,更重要的是如何正确的 ...

  3. 避免在WHERE条件中,在索引列上进行计算或使用函数,因为这将导致索引不被使用...

    点击(此处)折叠或打开 --在sal列上创建非唯一索引 scott@TESTDB11>create index idx_emp1_sal on emp1(sal); Index created. ...

  4. oracle删除列的限制,深入理解Oracle索引(10):索引列字符类型统计信息的32位限制...

    ㈠ 先看两个来自生产环境的真实案例: ㈡ 原理: Oracle 在对于 varchar等字符型字段收集统计信息时,并不会对每个值都进行精确的统计 而是,对值进行substr(,32).一般来讲,这种方 ...

  5. 大话企业上云之第二篇

    一.企业上云的动机 对于一家企业来说,选择上云,肯定得有收获,也就是上云能给企业带来什么? 大家还记得这样一部神剧,"硅谷",在篇中,主人公Richard所在的创业公司,也使用了公 ...

  6. mysql查询字段变慢,MySQL Query IN()子句在索引列上变慢

    我有一个由PHP脚本生成的MySQL查询,该查询将如下所示: SELECT * FROM Recipe_Data WHERE 404_Without_200 = 0 AND Failures_With ...

  7. 在索引列上正确使用LIKE运算符

    使用LIKE运算符执行基于通配符的模糊查询,查询包含字符串的所有数据. 查询条件可以包含数字或者字符文本: %表示零个或者多个字符. _ 表示一个字符. 1.LIKE做模糊查询时,首字母确定使用索引 ...

  8. android wcf 上传文件,第二篇 ( wcf 与 android 图片上传下载)

    老规矩废话不多说,直接入主题 注:wcf 使用rest风格,传递json数据,图片是经过base64编码,android 使用common-codec-1.5.jar 进行base64编码 服务器端 ...

  9. SQL Server 执行计划利用统计信息对数据行的预估原理二(为什么复合索引列顺序会影响到执行计划对数据行的预估)...

    本文出处:http://www.cnblogs.com/wy123/p/6008477.html 关于统计信息对数据行数做预估,之前写过对非相关列(单独或者单独的索引列)进行预估时候的算法,参考这里. ...

最新文章

  1. android一个简单的异步AsyncTask下载数示例,简单下载(07)
  2. 软件架构最佳实践和案例分析
  3. 正则表达式基础知识及应用(用于个人学习以及回顾)
  4. Thinkphp 3.2.2 利用phpexcel完成excel导出功能
  5. Android ListView几个重要属性
  6. Xshell替代品 -- FinalShell
  7. oracle listagg方法,Oracle实现字符串拼接和分离功能的方法(LISTAGG函数),oraclelistagg...
  8. 字符串之数组中两个字符串的最小距离
  9. win主机上搭建php网站运行环境,Windows server 2008搭建php运行环境图文详解(php5.3)
  10. 分享Silverlight/WPF/Windows Phone一周学习导读(11月14日-11月20日)
  11. prism v2之旅(7)
  12. Java FileInputStream
  13. 高级软件工程2017第7次作业--C++团队项目:Beta阶段综合报告
  14. U盘+WINPE 安装UEFI Ubuntu系统教程
  15. CSDN钱包提现协议
  16. 三星S5660刷机及Root
  17. 聚沙成塔,亚马逊云科技为智能汽车创新加速
  18. R语言构建logistic回归模型:模型系数(model coefficient)、模型总结信息(summary)、模型评估(偏差deviance计算、伪R方计算( pseudo R-squared)
  19. 微信公众号实现微信支付(含前后端完整代码)
  20. 这是我家养的睡莲 开花了

热门文章

  1. 计算包含+、-、*、/、(、)等几种运算符的表达式的值。
  2. php取表中最大的id,php中的增删查改
  3. Lambda表达式的生动理解以及Java Lambda表达式常见使用场景
  4. Jenkins 无法运行 putty.exe问题解决
  5. 第2章[2.4] Ext JS的类与类体系
  6. mybatis plus 日志打印_Mybatis-plus常用API全套教程,看完没有不懂的
  7. android pdf生成 路径,android – 如何从指向PDF文档的URI获取文件路径?
  8. python获取数组中大于某一阈值的那些索引值_Python NumPy 高级索引——整数组索引、布尔索引及花式索引...
  9. android多个拖动控件,Android使用WindowManager制作一个可拖动的控件
  10. linux+cd英文全称,Linux命令英文全称