SQL Server 2012中表直接关联与子查询关联的选择建议
嘿,针对你在SQL Server 2012上SAP数据库的这个场景,我绝对推荐写法2(先过滤大表再关联小表),核心原因如下:
性能优先:减少关联数据集大小
大表table1有几百万行,而你最终只需要最多100行数据。写法1是先把几百万行的table1和table2、table3做关联,再过滤;而写法2是先通过WHERE table1.field1 = 'x' and table1.field2 = 'y'把table1缩小到100行左右,再去关联小表。关联操作的成本和数据集大小直接相关,越小的数据集关联速度越快,能大幅减少不必要的计算量。避免优化器“踩坑”
虽然SQL Server的查询优化器会尝试调整执行顺序,但在复杂场景下(比如SAP表的特殊索引结构),它未必能100%优先过滤大表。写法2的子查询相当于给优化器明确的指令:“先把大表砍到最小再干活”,从逻辑上规避了先关联后过滤的低效路径——尤其是你没有权限查看执行计划,没法验证优化器的选择时,这种写法更稳妥。逻辑清晰,易维护
写法2的逻辑更直观:先圈出需要的核心数据,再关联其他表补充字段。后续如果要调整过滤条件或者限制行数(比如加上TOP 100确保不超过100行),直接修改子查询部分即可,可读性和维护性都比写法1好。
这里给你补全写法2的完整示例(加上TOP 100更保险):
select t1.fields, t2.*, t3.* from ( select TOP 100 fields from table1 where table1.field1 = 'x' and table1.field2 = 'y' ) t1 left join table2 on t1.join_key = table2.join_key left join table3 on t1.join_key = table3.join_key
另外提一句,因为你只有SELECT权限没法做调试和优化,这种“先过滤后关联”是关系型数据库通用的性能优化原则,在SQL Server 2012里完全适用,能帮你避开很多潜在的慢查询问题。
内容的提问来源于stack exchange,提问作者Alejandro

