连接中过滤器的 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 性能的主要内容,如果未能解决你的问题,请参考以下文章