通常在我写EXISTS语句时,我会写成IF EXISTS(SELECT TOP(1) 1 FROM XXX),也没细细考究过为什么要这么写,只是隐约认为这样写没有啥问题,那今天就深究下吧!

首先准备测试测试数据

USE [TestDB1]
GO
CREATE TABLE TB1001
(
ID INT IDENTITY(1,1),
C1 VARCHAR(200),
CONSTRAINT PK_TB1001_ID PRIMARY KEY(ID)
)
GO
CREATE INDEX IDX_ID ON TB1001(ID) GO
INSERT INTO TB1001(C1)
SELECT name FROM sys.columns
GO

其中需要注意下索引IDX_ID, 虽然ID已经是主键索引,但仍创建一个非聚集索引以供后续测试。

通常我们在写EXISTS语句时,一个纠结点是要不要使用TOP,另外一个纠结点是SELECT 语句中的返回列,因此构造测试语句如下:

IF EXISTS(SELECT 1 FROM [dbo].[TB1001] WHERE ID>10)
BEGIN
PRINT 1
END IF EXISTS(SELECT TOP(1) 1 FROM [dbo].[TB1001] WHERE ID>10)
BEGIN
PRINT 1
END IF EXISTS(SELECT TOP(10) 1 FROM [dbo].[TB1001] WHERE ID>10)
BEGIN
PRINT 1
END IF EXISTS(SELECT * FROM [dbo].[TB1001] WHERE ID>10)
BEGIN
PRINT 1
END IF EXISTS(SELECT ID FROM [dbo].[TB1001] WHERE ID>10)
BEGIN
PRINT 1
END IF EXISTS(SELECT C1 FROM [dbo].[TB1001] WHERE ID>10)
BEGIN
PRINT 1
END

以上语句各种写法,但最终生成的执行计划都一样,因此执行效率也一样:

对于IF EXISTS(SELECT C1 FROM [dbo].[TB1001] WHERE ID>10)语句,索引IDX_ID并没有包含C1列的数据,但查询仍使用IDX_ID索引,证明查询并不需要访问C1列的数据

从上面的操作运算符来看,可以得到以下两个结论:

1. 无论是TOP(1)还是TOP(10)或不使用TOP,执行计划中都没有TOP的操作,即使SQL语句中写明TOP(1)也会被忽略,因此TOP并不影响生成执行计划;

2. 无论使用SELECT 1 或者使用SELECT * 又或者使用SELECT C1 等,运算符都没有返回列信息(OUTPUT LIST), 即EXISTS并不关心返回数据的内容,只关心有没有数据,因此SELECT部分的内容也不影响生成执行计划;

--========================================================

PS: Seek Keys[1] 并不代表只返回一行数据,如对于查询:

SELECT TOP(10) * FROM [dbo].[TB1001] WHERE ID>10

其生成的执行计划为:

EXISTS语句的更多相关文章

  1. 曲演杂坛--EXISTS语句

    通常在我写EXISTS语句时,我会写成IF EXISTS(SELECT TOP(1) 1 FROM XXX),也没细细考究过为什么要这么写,只是隐约认为这样写没有啥问题,那今天就深究下吧! 首先准备测 ...

  2. 使用EXISTS语句注意点

    1.使用EXISTS语句,其目标列一般用“*”,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义. 2.使用EXISTS语句一定要注意上下两个表之间要建立联系. 例如,查询所有选修了1号 ...

  3. oracle中的exists 和not exists 用法 in与exists语句的效率问题

    博文来源(oracle中的exists 和not exists 用法):http://chenshuai365-163-com.iteye.com/blog/1003247 博文来源(  in与exi ...

  4. ORACLE in与exists语句的区别

    select * from A where id in(select id from B) 以上查询使用了in语句,in()只执行一次,它查出B表中的所有id字段并缓存起来.之后,检查A表的id是否与 ...

  5. EXISTS语句的子查询

    一.EXISTS运算符简介: 使用EXISTS语句可以测试集合是否为空,EXISTS语句通常与子查询结合在一起使用.只要子查询中至少返回一个值,则EXISTS语句的值就为True.EXISTS子查询的 ...

  6. ORACLE in与exists语句的区别(一)

    select * from Awhere id in(select id from B) 以上查询使用了in语句,in()只执行一次,它查出B表中的所有id字段并缓存起来.之后,检查A表的id是否与B ...

  7. 蕴含式(包含EXISTS语句的分析)

    *{ font-family: STFangSong; outline: none; } 蕴含式 一.蕴含式基础 (Ⅰ)什么是"蕴含式" 设p.q为两个命题.复合命题"如 ...

  8. sql语句:if exists语句使用

    ') begin print('exists ') end else begin print('no exists ') end go

  9. SQLSERVER语句 in和exists哪个效率高本人测试证明

    SQLSERVR语句 in和exists哪个效率高本人测试证明 最近很多人讨论in和exists哪个效率高,今天就自己测试一下 我使用的是客户的数据库GPOSDB(已经有数据) 环境:SQLSERVE ...

随机推荐

  1. QTP操作txt文档

    QTP可以在txt文件(文本文件中读取数据) 首先创造一个文档对象 set fso = createObject("scripting.filesystemobject") 然后用 ...

  2. [转]解决a different object with the same identifier value was already associated with the session错误

    1.a different object with the same identifier value was already associated with the session. 错误原因:在h ...

  3. django--模板(七)

    1.模板加载 一个项目可以有多个应用,每个应用下都可以有模板,思考模板的查找顺序?

  4. 这些年正Android - 母亲

    记得小时候,在自己写完一篇作文,完成母亲布置的任务后,就会搬走母亲正在使用的大椅子,面朝门前的马路,就这么憧憬的坐着,听着母亲给小孩打针时,小孩哇哇的哭声,努力的幻想着自己以后能做一个顶天立地的男子汉 ...

  5. 《循序渐进》之简单的DHCP实验

    目的:初学,配置简单的DHCP试验. 试验步骤: 1:拓扑图 2:配置: Router>en Router#config t Enter configuration commands, one ...

  6. python3 中mlpy模块安装 出现 failed with error code 1的决绝办法(其他模块也可用本方法)

    在python3 中安装其它模块时经常出现 failed with error code 1等状况,使的安装无法进行.而解决这个问题又非常麻烦. 接下来以mlpy为例,介绍一种解决此类安装问题的办法. ...

  7. 基于ADO.NET的SqlHelper类

    1.使用Connection连接数据库的步骤: (1).添加命名空间 System.Data.SqlClient(注意:初学者经常会忘记) (2)定义连接字符串.连接SQL Server 数据库时: ...

  8. Windows下安装Nginx反向代理服务器

    一,首先到 Nginx官方网站下载最新版本,下载网址: http://nginx.org/en/download.html 二,解压ZIP包,目录修改为nginx.放置在D盘根目录下,也可以放置在其它 ...

  9. python基础知识---迭代器、生成器、装饰器

    一.迭代器 二.生成器 http://www.cnblogs.com/huxi/archive/2011/07/14/2106863.html def func(): #定义生成器,和普通函数的区别是 ...

  10. lnmp编译安装

    lnmp超详细编译安装教程 linux采用的是centos,软件包统一放在/usr/local/src目录下.由于 centos源比较老,而且更新起来也比较慢,此处建议你换成163源.提示:如果你真打 ...