非索引列上的统计 第二篇
非索引列上的统计
有时候,可能在连接或过滤条件中的列上没有索引。即使对这种非索引列,如果查询优化器知道这些列的数据分布(统计),它也很可能做出最佳的选择。
除了索引上的统计,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默认的统计信息,但一般情况下不用关心它。除非查询性能变得慢,可以手动更新统计信息。
非索引列上的统计 第二篇相关推荐
- MySQL-count(*)、count(1)、count(主键)、count(非索引列)、count(索引列)性能分析
本文主要讨论的是count()函数在没有where的情况下统计性能 环境: MySQL 数据库5.7.23 服务器4核8G 带宽5M 1000W数据 为防止缓存影响,测试前已经将缓存关闭 一: 先说结 ...
- mysql left join 索引失效_MySQL索引列上做操作导致索引失效案例分析
索引列上做操作导致索引失效 通常我们认为只要建立索引就可以万事大吉,以为只要建立就一定会使用到,可其实在索引列上的计算.函数.类型转换都可能导致索引失效,所以我们不仅要会创建索引,更重要的是如何正确的 ...
- 避免在WHERE条件中,在索引列上进行计算或使用函数,因为这将导致索引不被使用...
点击(此处)折叠或打开 --在sal列上创建非唯一索引 scott@TESTDB11>create index idx_emp1_sal on emp1(sal); Index created. ...
- oracle删除列的限制,深入理解Oracle索引(10):索引列字符类型统计信息的32位限制...
㈠ 先看两个来自生产环境的真实案例: ㈡ 原理: Oracle 在对于 varchar等字符型字段收集统计信息时,并不会对每个值都进行精确的统计 而是,对值进行substr(,32).一般来讲,这种方 ...
- 大话企业上云之第二篇
一.企业上云的动机 对于一家企业来说,选择上云,肯定得有收获,也就是上云能给企业带来什么? 大家还记得这样一部神剧,"硅谷",在篇中,主人公Richard所在的创业公司,也使用了公 ...
- mysql查询字段变慢,MySQL Query IN()子句在索引列上变慢
我有一个由PHP脚本生成的MySQL查询,该查询将如下所示: SELECT * FROM Recipe_Data WHERE 404_Without_200 = 0 AND Failures_With ...
- 在索引列上正确使用LIKE运算符
使用LIKE运算符执行基于通配符的模糊查询,查询包含字符串的所有数据. 查询条件可以包含数字或者字符文本: %表示零个或者多个字符. _ 表示一个字符. 1.LIKE做模糊查询时,首字母确定使用索引 ...
- android wcf 上传文件,第二篇 ( wcf 与 android 图片上传下载)
老规矩废话不多说,直接入主题 注:wcf 使用rest风格,传递json数据,图片是经过base64编码,android 使用common-codec-1.5.jar 进行base64编码 服务器端 ...
- SQL Server 执行计划利用统计信息对数据行的预估原理二(为什么复合索引列顺序会影响到执行计划对数据行的预估)...
本文出处:http://www.cnblogs.com/wy123/p/6008477.html 关于统计信息对数据行数做预估,之前写过对非相关列(单独或者单独的索引列)进行预估时候的算法,参考这里. ...
最新文章
- android一个简单的异步AsyncTask下载数示例,简单下载(07)
- 软件架构最佳实践和案例分析
- 正则表达式基础知识及应用(用于个人学习以及回顾)
- Thinkphp 3.2.2 利用phpexcel完成excel导出功能
- Android ListView几个重要属性
- Xshell替代品 -- FinalShell
- oracle listagg方法,Oracle实现字符串拼接和分离功能的方法(LISTAGG函数),oraclelistagg...
- 字符串之数组中两个字符串的最小距离
- win主机上搭建php网站运行环境,Windows server 2008搭建php运行环境图文详解(php5.3)
- 分享Silverlight/WPF/Windows Phone一周学习导读(11月14日-11月20日)
- prism v2之旅(7)
- Java FileInputStream
- 高级软件工程2017第7次作业--C++团队项目:Beta阶段综合报告
- U盘+WINPE 安装UEFI Ubuntu系统教程
- CSDN钱包提现协议
- 三星S5660刷机及Root
- 聚沙成塔,亚马逊云科技为智能汽车创新加速
- R语言构建logistic回归模型:模型系数(model coefficient)、模型总结信息(summary)、模型评估(偏差deviance计算、伪R方计算( pseudo R-squared)
- 微信公众号实现微信支付(含前后端完整代码)
- 这是我家养的睡莲 开花了
热门文章
- 计算包含+、-、*、/、(、)等几种运算符的表达式的值。
- php取表中最大的id,php中的增删查改
- Lambda表达式的生动理解以及Java Lambda表达式常见使用场景
- Jenkins 无法运行 putty.exe问题解决
- 第2章[2.4] Ext JS的类与类体系
- mybatis plus 日志打印_Mybatis-plus常用API全套教程,看完没有不懂的
- android pdf生成 路径,android – 如何从指向PDF文档的URI获取文件路径?
- python获取数组中大于某一阈值的那些索引值_Python NumPy 高级索引——整数组索引、布尔索引及花式索引...
- android多个拖动控件,Android使用WindowManager制作一个可拖动的控件
- linux+cd英文全称,Linux命令英文全称