谓词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​



生成的执行计划如下:

Intersect, Except, Union, All and Any(3)_执行计划

其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​



生成的执行计划如下:

Intersect, Except, Union, All and Any(3)_使用场景_02

其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​



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

Intersect, Except, Union, All and Any(3)_使用场景_03

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

其等价query的Subtree Cost: 1.24078

 

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

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