SQL Server查询性能调优:全列关联与按需列关联孰优?
毫无疑问,仅选取你实际需要的列来执行关联,性能表现会比选取视图全列更优,尤其是在你描述的这种视图包含大量冗余列的场景下。下面具体拆解原因,结合你的场景来说明:
降低IO与内存开销:你的视图
vw_BILLABLE_CENSUS_R有近25列,但你只用到3列。当你只选取这3列+关联所需的Client和REPORTING_MONTH时,SQL Server不需要从磁盘读取那些无关列的数据,也不需要在内存中传输、存储这些冗余数据。对于数据量较大的视图,这会显著减少磁盘IO压力——而IO通常是SQL查询性能瓶颈的头号元凶。解锁更优的执行计划:查询优化器在生成执行计划时,会根据你选取的列来选择最适合的索引。如果你的视图基表上存在覆盖索引(包含你需要的3列以及关联键
Client、REPORTING_MONTH),优化器可以直接使用这个覆盖索引来完成查询,避免了“键查找”或“聚集索引扫描”这类开销更大的操作。但如果你选取全列,优化器可能无法利用这类覆盖索引,只能走更慢的扫描路径。避免不必要的计算逻辑:如果你的视图
vw_BILLABLE_CENSUS_R中包含计算列、用户定义函数调用或者复杂的表达式,选取全列会让这些无关列的计算也被执行一遍,白白消耗CPU资源。而只选取需要的列,这些多余的计算就会被跳过。
针对你的具体场景,把关联语句改成这样是完全合理的优化手段:
LEFT JOIN ( SELECT Client, REPORTING_MONTH, Column_1, Column_2, Column_3 FROM vw_BILLABLE_CENSUS_R ) CEN ON DE.Client = CEN.Client AND CAL.REPORTING_MONTH = CEN.REPORTING_MONTH
在数据量较大的情况下,你能明显看到查询执行时间的缩短。
当然也有极端情况差异不大:比如视图本身返回的行数极少,或者所有列的数据量都极小,但这种情况在实际业务场景中很少见。绝大多数时候,遵循“只选所需列”的原则都是提升SQL性能的有效手段。
内容的提问来源于stack exchange,提问作者gaurav b

