EXISTS语句
通常在我写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语句的更多相关文章
- 曲演杂坛--EXISTS语句
		通常在我写EXISTS语句时,我会写成IF EXISTS(SELECT TOP(1) 1 FROM XXX),也没细细考究过为什么要这么写,只是隐约认为这样写没有啥问题,那今天就深究下吧! 首先准备测 ... 
- 使用EXISTS语句注意点
		1.使用EXISTS语句,其目标列一般用“*”,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义. 2.使用EXISTS语句一定要注意上下两个表之间要建立联系. 例如,查询所有选修了1号 ... 
- oracle中的exists 和not exists 用法   in与exists语句的效率问题
		博文来源(oracle中的exists 和not exists 用法):http://chenshuai365-163-com.iteye.com/blog/1003247 博文来源( in与exi ... 
- ORACLE in与exists语句的区别
		select * from A where id in(select id from B) 以上查询使用了in语句,in()只执行一次,它查出B表中的所有id字段并缓存起来.之后,检查A表的id是否与 ... 
- EXISTS语句的子查询
		一.EXISTS运算符简介: 使用EXISTS语句可以测试集合是否为空,EXISTS语句通常与子查询结合在一起使用.只要子查询中至少返回一个值,则EXISTS语句的值就为True.EXISTS子查询的 ... 
- ORACLE in与exists语句的区别(一)
		select * from Awhere id in(select id from B) 以上查询使用了in语句,in()只执行一次,它查出B表中的所有id字段并缓存起来.之后,检查A表的id是否与B ... 
- 蕴含式(包含EXISTS语句的分析)
		*{ font-family: STFangSong; outline: none; } 蕴含式 一.蕴含式基础 (Ⅰ)什么是"蕴含式" 设p.q为两个命题.复合命题"如 ... 
- sql语句:if exists语句使用
		') begin print('exists ') end else begin print('no exists ') end go 
- SQLSERVER语句 in和exists哪个效率高本人测试证明
		SQLSERVR语句 in和exists哪个效率高本人测试证明 最近很多人讨论in和exists哪个效率高,今天就自己测试一下 我使用的是客户的数据库GPOSDB(已经有数据) 环境:SQLSERVE ... 
随机推荐
- MyBatis的应用
			a)首先先导入固定的jar包 b)添加mybatis配置文件mybatis-config.xml 1.添加mybatis配置文件mybatis-config.xml <?xml version= ... 
- asp.net中按钮回车事件(转自http://www.cnblogs.com/adinet/archive/2013/03/03/2941424.html)
			在做ASP.net WEB应用的时候,常常遇到会在同一个页面里添加多个按钮,而每个按钮肯定都会触发页面回送事件. 在ASP.NET中,只能指定一个带有runat="server"的 ... 
- leetcode-【hard】4. Median of Two Sorted Arrays
			题目 There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the ... 
- bash profile .bashrc
			/etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. 并从/etc/profile.d目录的配置文件中搜集shell的设置. /etc/bashrc:为每一 ... 
- javascript数组的一些方法实例
			1 concat 
- SSH与Webservice整合记录
			一.首先搭好SSH框架: 1. Struts:MyEclipse菜单栏MyEclipse——>Project Capabilities——>Add Struts Capabilities, ... 
- Find the largest K numbers from array (找出数组中最大的K个值)
			Recently i was doing some study on algorithms. A classic problem is to find the K largest(smallest) ... 
- html css 编写规范
			html 规范 一 语法 1.用两个空格带她tab, 2.嵌套的元素应该缩进一次,即两个空格是最好 3.属性定义,全部使用双引号,尽量避免单引号. 4.不要在自闭和标签尾部添加闭合标签. 5.可选得结 ... 
- win7配置SMTP服务
			有人说WIN7系统没有SMTP服务 怎么可能呢??? 具体安装步骤如下: 控制面板\程序>打开和关闭Windows功能 Internet信息服务 将 万维网服务>应用程序开发功能> ... 
- WebKit的CSS扩展(WebKit是私有属性)
			http://www.css88.com/webkit/-webkit-touch-callout/ -webkit-tap-highlight-color 是一个 不规范的属性(unsupporte ... 
