zoukankan      html  css  js  c++  java
  • 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谓词在性能方面的好处,可能使用这两个谓词的唯一目的是为了方便。

  • 相关阅读:
    logback 范例
    mysql中int、bigint、smallint 和 tinyint的区别详细介绍
    MySQL中视图和普通表的区别
    Linux 下升级JDK 1.7到1.8
    本人遇到的spring事务之UnexpectedRollbackException异常解决笔记
    Spring 调度任务@scheduled学习总结
    javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint
    spring中的scope详解
    Spring Boot 静态资源处理
    用人所长
  • 原文地址:https://www.cnblogs.com/cxd4321/p/3042937.html
Copyright © 2011-2022 走看看