谓词ANY和ALL,我从不需要使用
1. ANY
以下两个query会返回相同的结果和执行计划
1 2 3 4 5 6 7 8 9 10 11 12 13 | select *from Sales.SalesPersonwhere TerritoryID = ANY(select TerritoryID from Sales.SalesTerritory where CountryRegionCode = 'US')select *from Sales.SalesPersonwhere 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, TotalDueinto Sales.TopSalesfrom Sales.SalesOrderHeaderorder by TotalDue descalter table Sales.TopSalesadd 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.SalesOrderHeaderwhere 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.SalesOrderHeaderwhere 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.SalesOrderHeaderwhere TotalDue > ALL(select TotalDue from Sales.TopSales)order by TotalDue desc select *from Sales.SalesOrderHeaderwhere 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谓词在性能方面的好处,可能使用这两个谓词的唯一目的是为了方便。