代码之家  ›  专栏  ›  技术社区  ›  Sebastian Dietz

SQL“存在”使用变体的性能

  •  23
  • Sebastian Dietz  · 技术社区  · 17 年前

    以下三条SQL语句的性能有什么不同吗?

    SELECT * FROM tableA WHERE EXISTS (SELECT * FROM tableB WHERE tableA.x = tableB.y)
    
    SELECT * FROM tableA WHERE EXISTS (SELECT y FROM tableB WHERE tableA.x = tableB.y)
    
    SELECT * FROM tableA WHERE EXISTS (SELECT 1 FROM tableB WHERE tableA.x = tableB.y)
    

    当所有语句行为相同时,是否有最佳实践?

    9 回复  |  直到 14 年前
        1
  •  34
  •   OMG Ponies    15 年前

    EXISTS子句的实际情况是SELECT子句未在EXISTS子句中求值-您可以尝试:

    SELECT * 
      FROM tableA 
     WHERE EXISTS (SELECT 1/0 
                     FROM tableB 
                    WHERE tableA.x = tableB.y)
    

    SELECT * 
      FROM tableA 
     WHERE EXISTS (SELECT NULL
                     FROM tableB 
                    WHERE tableA.x = tableB.y)
    

    EXISTS子句中最重要的是FROM和beyond子句——WHERE、groupby、have等。

        2
  •  15
  •   Peter Mortensen Pieter Jan Bonestroo    15 年前

    一般来说,如果代码提供了其他好处并且实际上不影响性能,那么编写看起来效率很低的代码时不要害怕,这一点很重要。

    也就是说,优化器几乎总是执行复杂的连接/选择/分组向导,以同样的方式保存简单的EXISTS/子查询。

    在给了你自己之后 kudos

    这个故事的寓意是了解您的平台优化器。尝试不同的事情,看看实际在做什么,因为关于“装饰性”查询优化的猖獗下意识假设几乎总是不正确的,与我的经验无关。

        3
  •  7
  •   Thomas    13 年前

    我意识到这是一篇老文章,但我认为重要的是要澄清 人们可能会选择一种格式而不是另一种格式。

    想象上的

    在我发现这个“特性”之前,我曾经 Exists( Select *... Select 1/0 Select 1

    Exists( Select 1... Select Null 也可以达到同样的目的,但只是需要写更多的字符。

    我换了 Exists( Select 1 Exists( Select * 这将完全相同。

    也就是说,我可以提供一个很好的理由来避免 Exists(Select * Select *

        4
  •  3
  •   Charles Bretana    17 年前

    至少在SQL Server中,

    可以从磁盘读取的最小数据量是一页磁盘空间。只要处理器读取一条满足子查询谓词的记录,它就可以停止。子查询不会像独立运行一样执行,然后包含在外部查询中,而是作为整个查询的完整查询计划的一部分执行。因此,当用作子查询时,Select子句中的内容实际上并不重要,外部查询不会返回任何内容,只会返回一个布尔值来指示是否找到单个记录。。。

    所有三个都使用完全相同的执行计划

    我总是使用[Select*From…],因为我认为它读起来更好,因为它并不意味着我希望从子查询返回某些特定的内容。

        5
  •  1
  •   inferis    17 年前

    这是一个即将引发某种圣战的问题。

    here .

    我认为答案可能是使用第三种选择,但是速度的增加是如此之小,真的不值得担心。这很容易成为SQL Server可以在内部优化的查询类型,因此您可能会发现所有选项都是等效的。

        6
  •  1
  •   shA.t Rami Jamleh    10 年前

    这个 EXISTS 布尔值

        7
  •  0
  •   Thuglife    17 年前

    Execution Plan . 学习它,使用它,热爱它

    真的,没有办法猜测。

        8
  •  0
  •   Branko Dimitrijevic    13 年前

    SELECT 1 源于旧的Microsoft SQL Server(2005年以前)-它的查询优化器不够聪明,无法避免从表中物理获取字段以进行查询 SELECT * . 据我所知,没有其他数据库管理系统存在这种缺陷。

    这个 这似乎是最常见的,但其他人也可以接受。

        9
  •  -4
  •   DonOctavioDelFlores    17 年前