谓词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
|
生成的执行计划如下:
其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
|
生成的执行计划如下:
其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谓词的query的Subtree Cost: 3.46994
其等价query的Subtree Cost: 1.24078
对于试用ANY和ALL得到的结论
从以上的实验中没有看出使用ANY或ALL谓词在性能方面的好处,可能使用这两个谓词的唯一目的是为了方便。