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

  • 相关阅读:
    dll学习
    mysql解压版安装
    mysql创建用户以及搭建数据库
    Springboot使用mybatis-plus
    分布式系统
    2、Zookeeper安装以及dubbo-admin的安装启动
    搭建分布式系统(idea+springboot+dubbo)
    Zookeeper下载和启动
    Spring Cloud底层原理
    Redis
  • 原文地址:https://www.cnblogs.com/cxd4321/p/3042937.html
Copyright © 2011-2022 走看看