您的位置:首页 > 其它

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

2013-04-25 17:06 387 查看
谓词ANY和ALL,我从不需要使用

1.ANY

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

?
12345678910111213
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

?
1234567891011121314
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记录

?
12345678
select
*
from
Sales.SalesOrderHeader
where
TotalDue>
ANY
(
select
TotalDue
from
Sales.TopSales)
order
by
TotalDue
desc
生成的执行计划如下:





其SubtreeCost:3.47018

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

?
12345678
select
*
from
Sales.SalesOrderHeader
where
TotalDue>(
select
min
(TotalDue)
from
Sales.TopSales)
order
by
TotalDue
desc
生成的执行计划如下:





其SubtreeCost:1.24078

2.ALL

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

?
1234567891011121314151617
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的SubtreeCost:3.46994

其等价query的SubtreeCost:1.24078

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

从以上的实验中没有看出使用ANY或ALL谓词在性能方面的好处,可能使用这两个谓词的唯一目的是为了方便。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐