连接中过滤器的 SQL 性能与结果中的 SQL 性能

Posted

技术标签:

【中文标题】连接中过滤器的 SQL 性能与结果中的 SQL 性能【英文标题】:SQL performance of filter in join vs in results where 【发布时间】:2020-09-10 18:30:21 【问题描述】:

我需要加入 2 个表,但其中一个表有一个必须应用的常量过滤器,我的问题是哪个选项在性能方面更好:

    在“FROM”上使用常量过滤器并设置这样的别名:

     SELECT <result fields> 
     FROM 
         (SELECT <table A fields> 
          FROM filtered_table 
          WHERE field = value) AS A 
     LEFT OUTER JOIN tableB ON A.id = tableB.id
    

    在主查询的WHERE 中设置过滤器:

    SELECT <result fields> 
    FROM filtered_table AS A 
    LEFT OUTER JOIN tableB ON A.id = tableB.id 
    WHERE a.field = value
    

【问题讨论】:

我很确定任何现代 DBMS 都会以完全相同的方式运行这两个查询。但如果您想确定,请查看execution plan 【参考方案1】:

大多数数据库将这两种形式视为相同的——它们在逻辑上是相同的,优化器知道这一点。

一些数据库倾向于实现子查询。 mysql 就是其中之一。在那个数据库中,子查询可能会更昂贵,因为它会写出子查询。

我建议编写不带子查询的代码。它的写和读都更简单,而且性能永远不会比子查询方法差。

【讨论】:

以上是关于连接中过滤器的 SQL 性能与结果中的 SQL 性能的主要内容,如果未能解决你的问题,请参考以下文章

SQL执行过程中的性能负载点

左外连接 SQL 服务器中的性能问题

Linq To Sql 左外连接 - 过滤空结果

SQL之复杂查询与视图

SQL之复杂查询与视图

使用 PL/SQL 游标为报告工具返回结果集