代码之家  ›  专栏  ›  技术社区  ›  user1532449

JOIN with conditions vs WHERE子句

  •  0
  • user1532449  · 技术社区  · 2 年前

    我有两个问题。

    查询#1:

    select t1.PK 
    from table1 as t1 
    join table2 as t2 on t1.pk = t2.pk .... 
    where t1.someattribute = somecondition
    

    查询#2:

    select t1.PK 
    from table1 as t1 
    join table2 as t2 on (t1.pk = t2.pk 
                          and t1.someattribute = somecondition)
    

    哪一个表现更好?我的理解是,第二个更好,因为当它连接两个表时,它选择了要使用的行,因此它不会在内存中保留大量的行(取决于表的大小) where 子句将被丢弃,并且只被白白保存在内存中。

    但当我测试它们时,我看不出有多大区别。有人能确认/否认在连接发生时添加AND会减少表使用的行数这一前提是否成立吗?

    1 回复  |  直到 2 年前
        1
  •  1
  •   JNevill    2 年前

    SQL是一种声明性语言。您可以通过SQL描述您想要什么,而您提交该SQL的系统决定如何为您获得它。换言之,你对它如何达到这个结果没有太多的发言权。因此,在几乎所有的RDBMS中,这两条语句都是同义的。

    解析完sql后,系统将执行优化步骤以尽快执行。任何称职的RDBMS都将执行一个称为“谓词下推”的优化步骤,在该步骤中,它将接受WHERE子句中的条件,并确定在读取表时是否可以将它们应用于数据选择。

    如果选择EVERYTHING,并且只有在通过所有联接将数据混洗在一起之后,才最终查看WHERE子句,那就有点傻了。归根结底,微软在云业务中并没有不必要地消耗计算,也许是这样。我不在那里工作。

    无论如何,我没有Azure实例要测试,但如果你想确认,你可以为这两个查询运行解释/执行计划,并亲自查看是否有任何差异。它们很可能是一样的。

    推荐文章