通常在我写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. MyBatis的应用

    a)首先先导入固定的jar包 b)添加mybatis配置文件mybatis-config.xml 1.添加mybatis配置文件mybatis-config.xml <?xml version= ...

  2. asp.net中按钮回车事件(转自http://www.cnblogs.com/adinet/archive/2013/03/03/2941424.html)

    在做ASP.net WEB应用的时候,常常遇到会在同一个页面里添加多个按钮,而每个按钮肯定都会触发页面回送事件. 在ASP.NET中,只能指定一个带有runat="server"的 ...

  3. 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 ...

  4. bash profile .bashrc

    /etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. 并从/etc/profile.d目录的配置文件中搜集shell的设置. /etc/bashrc:为每一 ...

  5. javascript数组的一些方法实例

    1 concat

  6. SSH与Webservice整合记录

    一.首先搭好SSH框架: 1. Struts:MyEclipse菜单栏MyEclipse——>Project Capabilities——>Add Struts Capabilities, ...

  7. 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) ...

  8. html css 编写规范

    html 规范 一 语法 1.用两个空格带她tab, 2.嵌套的元素应该缩进一次,即两个空格是最好 3.属性定义,全部使用双引号,尽量避免单引号. 4.不要在自闭和标签尾部添加闭合标签. 5.可选得结 ...

  9. win7配置SMTP服务

    有人说WIN7系统没有SMTP服务 怎么可能呢??? 具体安装步骤如下: 控制面板\程序>打开和关闭Windows功能 Internet信息服务  将 万维网服务>应用程序开发功能> ...

  10. WebKit的CSS扩展(WebKit是私有属性)

    http://www.css88.com/webkit/-webkit-touch-callout/ -webkit-tap-highlight-color 是一个 不规范的属性(unsupporte ...