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/p/3042937.html