SQL Server执行计划那些事儿(2)——查找和扫描
接下来的文章是记录自己曾经的盲点,同时也透漏了自己的发展历程(可能发展也算不上,只能说是瞎混)。当然,一些盲点也在工作和探究过程中慢慢有些眉目,现在也愿意发扬博客园的奉献精神,拿出来和大家分享一下。
开门见上,直接入题
在查看执行计划时候,你是否曾经也和我一样,有这样的疑惑呢?查找和扫描究竟是什么,以及他们的在查询性能上有什么区别。下面分享下我的理解。
扫描和查找是SQL Server从表或索引中读取数据所采用的迭代器,又因为经常在执行计划中看到,因此理解他们之间的区别,对我们优化查询有很重要的意义。
表扫描是在整张表上进行,而索引扫描是在整个页级上进行处理的,然而索引查找则是在查找谓词上的一个或者几个页上进行,因此他通常情况下,索引查找会有更少的IO开销。
由于扫描是对整个表中的行或者页,不论是否满足条件,逐一进行的。因此,其查询开销是衡定的,与返回结果集无关。索引查找是在所在谓词的几个页上进行,通常情况下,返回的结果集越多,其开销就会越大。
然而,通过上面的描述,我们可不能认为,查找就是好的,而扫描就是不好的(因为影响扫描性能的还有并行度),但是在绝大部分情况下,特别是数据量比较大,而返回的结果集比较少时,查找要比扫描有着更好的性能表现,另外也不是所有的扫描都可以优化掉的。
下面,我们通过例子来认识下,查询和扫描在性能上的区别。
我们还用SQL Server执行计划那些事儿(1)中的例子(删除之前建立的索引)。
我们来执行下面的查询
1.在没有索引的情况下
select ID ,Amount,Discount,BuyDate from Headers
select ID ,Amount,Discount,BuyDate from Headers where BuyDate='2008-09-15'
结果:在表扫描的情况下,尽管结果集中,仅一条数据,但是IO开销并没有减少,仍然和返回全部结果集是一样的。
2.在有索引(非聚集索引,要覆盖返回列,否则会引起RID查找,或者键值查找,这些会在以后的文章中讲述。)
创建索引
create nonclustered index index_headers_buyDate on Headers(BuyDate)
include (ID ,Amount,Discount)
go
select ID ,Amount,Discount,BuyDate from Headers
select ID ,Amount,Discount,BuyDate from Headers where BuyDate='2008-09-15'
结果:在索引扫描和索引查找情况下,所用的开销和返回的结果紧密相连
总结
1.当表中的数据很少或满足谓词的行比较多时,采用扫描操作比较有效。
2.如果表中数据量比较大或满足谓词的行较少时,使用扫描将读取更多的页面或执行更多的I/O操作来获取数据,这显而不是最有效的方法.
3.查找和扫描相比,查找并不总是好的,扫描也并不是坏的,因为SQL Server可能为该查询分配多个线程(并行度)。
SQL Server执行计划那些事儿(2)——查找和扫描的更多相关文章
- SQL Server执行计划那些事儿(3)——书签查找
接下来的文章是记录自己曾经的盲点,同时也透漏了自己的发展历程(可能发展也算不上,只能说是瞎混).当然,一些盲点也在工作和探究过程中慢慢有些眉目,现在也愿意发扬博客园的奉献精神,拿出来和大家分享一下. ...
- SQL Server执行计划那些事儿(1)——哈希、合并、嵌套联接的选择
接下来的文章是记录自己曾经的盲点,同时也透漏了自己的发展历程(可能发展也算不上,只能说是瞎混).当然,一些盲点也在工作和探究过程中慢慢有些眉目,现在也愿意发扬博客园的奉献精神,拿出来和大家分享一下. ...
- SQL Server 执行计划缓存
标签:SQL SERVER/MSSQL SERVER/数据库/DBA/内存池/缓冲区 概述 了解执行计划对数据库性能分析很重要,其中涉及到了语句性能分析与存储,这也是写这篇文章的目的,在了解执行计划之 ...
- SQL Server 执行计划中的扫描方式举例说明
SQL Server 执行计划中的扫描方式举例说明 原文地址:http://www.cnblogs.com/zihunqingxin/p/3201155.html 1.执行计划使用方式 选中需要执行的 ...
- SQL Server 执行计划操作符详解(3)——计算标量(Compute Scalar)
接上文:SQL Server 执行计划操作符详解(2)--串联(Concatenation ) 前言: 前面两篇文章介绍了关于串联(Concatenation)和断言(Assert)操作符,本文介绍第 ...
- sql server 执行计划(execution plan)介绍
大纲:目的介绍sql server 中执行计划的大致使用,当遇到查询性能瓶颈时,可以发挥用处,而且带有比较详细的学习文档和计划,阅读者可以按照我计划进行,从而达到对执行计划一个比较系统的学习. 什么是 ...
- 引用:初探Sql Server 执行计划及Sql查询优化
原文:引用:初探Sql Server 执行计划及Sql查询优化 初探Sql Server 执行计划及Sql查询优化 收藏 MSSQL优化之————探索MSSQL执行计划 作者:no_mIss 最近总想 ...
- SQL Server 执行计划操作符详解(2)——串联(Concatenation )
本文接上文:SQL Server 执行计划操作符详解(1)--断言(Assert) 前言: 根据计划,本文开始讲述另外一个操作符串联(Concatenation),读者可以根据这个词(中英文均可)先幻 ...
- 浅析SQL SERVER执行计划中的各类怪相
在查看执行计划或调优过程中,执行计划里面有些现象总会让人有些疑惑不解: 1:为什么同一条SQL语句有时候会走索引查找,有时候SQL脚本又不走索引查找,反而走全表扫描? 2:同一条SQL语句,查询条件的 ...
随机推荐
- fabric 安装及使用
官网地址 1.安装 pip install fabric 依赖 Paramiko .PyCrypto库 以下依赖肯能要手动安装 #安装 pycrypto 密码库pip install pycrypto ...
- 黑马程序员 Java基础<九>---> 多线程
ASP.Net+Android+IOS开发..Net培训.期待与您交流! 多线程 一.概述: 1.线程是什么 说到线程,我们就得先说说进程.所谓进程,就是一个正在执行(进行)中的程序,每一个进程执行都 ...
- Eclipse中更改默认java代码格式【转】
在写代码时常常有2种代码样式习惯,如下图.由于一直习惯了第一种代码格式,而看第二种代码格式时感觉代码很乱,总找不到“{ }”对称的感觉.Eclipse自动格式化代码的快捷方式是Ctrl+Shift+F ...
- MVC模式下My97DatePicker日期控件引用注意事项
My97DatePicker日期控件之前在用webform模式开发的时候,只要 <script language="javascript" type="text/j ...
- 我是如何开发一个连锁企业的信息系统的,NO.1
我是如何开发一个连锁企业的信息系统的,NO.1 连锁企业的信息系统的开发,一半要经历系统分析.系统设计.系统实施.系统评价和系统维护等五个阶段, 而在每个实施阶段中又具体划分出许多阶段性目标和实施步骤 ...
- RMAN备份之非归档模式下的备份
Backing Up a Database in NOARCHIVELOG Mode:1.Log into RMAN2.Shutdown immediate from RMAN3.Startup mo ...
- Oracle文章中常用数据表的描述
desc stud; 名称 空值 类型 ---- -------- ------------ ID NOT NULL NUMBER(38) NAME ...
- (转)C# WinForm中 获得当前鼠标所在控件 或 将窗体中鼠标所在控件名显示在窗体标题上
原文地址:http://www.cnblogs.com/08shiyan/archive/2011/04/14/2015758.html /********************** * 课题:将窗 ...
- Metafunction
Metafunction is a more general idiom than type generator. Metafunctions that produce type(s) as a re ...
- struts2中的方法过滤拦截器
方法过滤拦截器是只过滤指定的方法,如果使用针对action 的普通的过滤器则会过滤该action内部 所有方法.如果在一个action中同时有多个作为业务逻辑控制的方法存在 的话则会过滤所有的业务逻辑 ...