非索引列上的统计

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

  除了索引上的统计,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. 索引列上的统计 <第一篇>

    一.索引在查询优化中的角色 SQL Server的查询优化器是基于开销的优化器.它通过确认选择性.数据的唯一性以及过滤数据(通过WHERE或JOIN子句)所使用的列来决定最佳的数据访问机制.统计与索引 ...

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

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

  3. UNIQUEIDENTIFIER列上的统计信息

    UNIQUEIDENTIFIER列上的统计信息非常有意思,在它上面有一些很令人讨厌的行为.我们来看下. 问题重现(The repro) 为了向你展示我们刚抱怨的行为,我用下列简单的表定义创建了一个数据 ...

  4. oracle避免在索引列上使用NOT

    通常, 我们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的 影响. 当ORACLE”遇到”NOT,他就会停止使用索引转而执行全表扫描. 举例: 低效: (这里,不使用索引) S ...

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

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

  6. oracle避免在索引列上使用IS NULL和IS NOT NULL

    避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引 .对于单列索引,如果列包含空值,索引中将不存在此记录. 对于复合索引,如果每个列都为空,索引中同样不存在此记录. 如果至少有一个列不为空 ...

  7. oracle避免在索引列上使用计算

    WHERE子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描. 举例: 低效: SELECT … FROM DEPT WHERE SAL * 12 > 25000; 高效: SE ...

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

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

  9. 【优化】COUNT(1)、COUNT(*)、COUNT(常量)、COUNT(主键)、COUNT(ROWID)、COUNT(非空列)、COUNT(允许为空列)、COUNT(DISTINCT 列名)

    [优化]COUNT(1).COUNT(*).COUNT(常量).COUNT(主键).COUNT(ROWID).COUNT(非空列).COUNT(允许为空列).COUNT(DISTINCT 列名) 1. ...

随机推荐

  1. JS打印、预览(IE,Chrome)

    IE下: 调用IE内置打印组件完成web打印方案.IE调用ActiveX实现打印. 重点: 注意: 1.CSS对打印的控制: .Noprint{display:none;} .PageNext{pag ...

  2. 解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)——ubuntu环境设置默认是utf-8,文件编码可使用Encodersoft批量转换

    一.Qt环境设置 文件从window上传到Ubuntu后会显示乱码,原因是因为ubuntu环境设置默认是utf-8,Windows默认都是GBK.Windows环境下,Qt Creator,菜单-&g ...

  3. android 之 百度地图

    简介 百度地图Android定位SDK为基于移动客户端开发LBS应用提供基础定位能力. 功能介绍 功能介绍: 地图展示:包括2D图.卫星图.3D图地图展示. 地图操作:提供控制平移.缩放.底图旋转.变 ...

  4. 按每k个结点反转链表

    //按每k个结点反转链表 Node* turn_k(Node* head,int n,int k) { Node* p=head; ;t<k;t++) p=p->next; //为了获取最 ...

  5. 修改xcode代码风格设置

    1.找到文件:/Applications/Xcode.app/Contents/PlugIns/IDECodeSnippetLibrary.ideplugin/Contents/Resources/S ...

  6. 又一编辑神器-百度编辑器-Ueditor

    (Lionden<hsdlionden@gmail.com> 转载说明) 前段时间发表过一篇关于“KindEditor在JSP中使用”的博文.这几天在沈阳东软进行JavaWeb方面的实习工 ...

  7. THREE.JS + Blender(obj、mtl加载代码)

    2016-11-04 09:23:17 THREE.REVISION "81dev" Blender     "2.78" 1.加载OBJ.MTL文件 // T ...

  8. tomcat动态映射路径

    写了一个工具类,将上传文件功能保存文件的目录移到webapps目录外面,通过动态生成xml映射文件到tomcat\conf\Catalina\localhost目录下从而实现目录映射.可以被http直 ...

  9. 1042. Shuffling Machine (20) - sstream实现数字转字符串

    题目例如以下: Shuffling is a procedure used to randomize a deck of playing cards. Because standard shuffli ...

  10. MongoDB[mark]总忘记它们是干啥的

    MongoDB集群包括一定数量的mongod(分片存储数据).mongos(路由处理).config server(配置节点).clients(客户端).arbiter(仲裁节点:为了选举某个分片存储 ...