SQL查询可选运行派生表时WHERE子句与JOIN条件过滤数据哪种更快
结论
示例2(在派生表WHERE子句中加短路逻辑)的执行速度更快,尤其是@fetchPricingData = 'No'的时候优势特别明显。
原因
- 参数为
No时,示例2里派生表的WHERE @fetchPricingData = 'Yes'明显是永远不成立的条件,数据库优化器一眼就能认出来,根本不会去扫描pricing_info表的任何数据,也不用跑派生表里的其他查询逻辑,直接返回个空结果集就行,后面JOIN关联空表的开销可以忽略。 - 示例1把判断放到了JOIN的ON条件里,优化器没法提前砍掉派生表的执行逻辑:得先把派生表的查询全跑完,把
pricing_info里符合要求的数据全读出来生成临时结果集,等到关联的时候才发现条件永远不成立,把所有关联行都过滤掉,等于白花了读定价表、生成临时表的IO和内存开销。 - 如果参数是
Yes,两种写法速度差不多,这时候条件都成立,优化器都会正常查定价表再做关联,没什么额外开销。
注:这个性能差异是通用的,SQL Server、PostgreSQL、MySQL 8.0+这些主流数据库的优化器都支持这种恒假条件的提前剪枝优化,不用担心兼容性问题。
内容的提问来源于stack exchange,提问作者Tyson Freeze
相关产品推荐
相关产品推荐

