Intersect, Except, Union, All and Any(3)

谓词ANY和ALL,我从不需要使用

1. ANY

以下两个query会返回相同的结果和执行计划

?
1
2
3
4
5
6
7
8
9
10
11
12
13
select
     *
from
     Sales.SalesPerson
where
     TerritoryID = ANY ( select  TerritoryID from  Sales.SalesTerritory where  CountryRegionCode = 'US' )
 
select
     *
from
     Sales.SalesPerson
where
     TerritoryID in  ( select  TerritoryID from  Sales.SalesTerritory where  CountryRegionCode = 'US' )
?
1
  

为了演示ANY谓词的实际使用场景,我们使用如下代码在AdventureWorks库中创建一张新表Sales.TopSales

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
select  top  5
     SalesOrderID,
     TotalDue
into
     Sales.TopSales
from
     Sales.SalesOrderHeader
order  by
     TotalDue desc
 
alter  table  Sales.TopSales
add  constraint  PK_TopSales primary  key  clustered(SalesOrderID)
 
create  index  idx_TopSales_TotalDue on  Sales.TopSales(TotalDue desc )

我们来获得超过Sales.TopSales表中最小TotalDue的SalesOrderHeader记录

?
1
2
3
4
5
6
7
8
select
     *
from
     Sales.SalesOrderHeader
where
     TotalDue > ANY ( select  TotalDue from  Sales.TopSales)
order  by
     TotalDue desc

生成的执行计划如下:

ANY

其Subtree Cost:3.47018

 

使用另一种方法实现相同逻辑

?
1
2
3
4
5
6
7
8
select
     *
from
     Sales.SalesOrderHeader
where
     TotalDue > ( select  min (TotalDue) from  Sales.TopSales)
order  by
     TotalDue desc

生成的执行计划如下:

MIN

其Subtree Cost:1.24078

 

2. ALL

谓词ALL允许对一个SELECT结果列表中的所有值进行比较。以下两个查询是逻辑对等的。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
select
     *
from
     Sales.SalesOrderHeader
where
     TotalDue > ALL ( select  TotalDue from  Sales.TopSales)
order  by
     TotalDue desc
     
select
     *
from
     Sales.SalesOrderHeader
where
     TotalDue > ( select  max (TotalDue) from  Sales.TopSales)
order  by
     TotalDue desc

两个查询所生成的执行计划如下,有着明显的不同之处

ALL

使用ALL谓词的query的Subtree Cost: 3.46994

其等价query的Subtree Cost: 1.24078

 

对于试用ANY和ALL得到的结论

从以上的实验中没有看出使用ANY或ALL谓词在性能方面的好处,可能使用这两个谓词的唯一目的是为了方便。

转载于:https://www.cnblogs.com/cxd4321/archive/2013/04/25/3042937.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值