SQL Server中YEAR函数是否仍非SARGable?2014年后有无版本变化?
SQL Server 2014后YEAR()函数查询的SARGable特性变化
在SQL Server 2014至2019版本中,WHERE YEAR(orderdate) = 2014这类对索引列直接使用函数的写法依然是非SARGable的:优化器无法直接利用orderdate上的聚集索引执行高效的范围扫描,只能被迫进行索引扫描或全表扫描,性能远不如手动写成范围条件的查询。
这种情况在SQL Server 2022版本发生了改变:SQL Server 2022的智能查询处理(IQP)新增了日期函数的自动转换优化,当数据库兼容性级别设置为160(2022默认级别)且相关优化特性启用时,优化器会自动将YEAR(orderdate) = 2014重写为等价的范围条件orderdate >= '20140101' AND orderdate < '20150101',从而能够利用索引进行高效的范围扫描。
不过需要注意:
- 该优化依赖特定版本和兼容性设置,并非所有环境都能生效;
- 手动编写范围条件的写法在所有SQL Server版本中都能稳定保证SARGable,是更稳妥的选择。
示例代码
非SARGable写法(2022之前无法高效利用索引):
SELECT orderid, orderdate, filler FROM dbo.Orders WHERE YEAR(orderdate) = 2014;
推荐的SARGable写法(全版本通用):
SELECT orderid, orderdate, filler FROM dbo.Orders WHERE orderdate >= '20140101' AND orderdate < '20150101';
内容的提问来源于stack exchange,提问作者J. Mini
相关产品推荐
相关产品推荐

