在一本关于SQL Server 2014的书中,我被建议避免

SELECT orderid, orderdate, filler
FROM dbo.Orders
WHERE YEAR(orderdate) = 2014;

并且更喜欢

SELECT orderid, orderdate, filler
FROM dbo.Orders
WHERE orderdate >= '20140101'
AND orderdate < '20150101';

orderdate上有聚集索引时,因为使用YEAR会使查询不可SARGable.

自SQL Server 2014年以来,这种情况是否发生了变化?如果是,它改成了什么版本?

推荐答案

是的--它仍然是不可马赛尔的(2022 Fiddle).

Connect站点上的几个相关请求(Wayback机器链接)是

但到目前为止,这些措施从未实施过.对第二个问题(特别提到YEAR个)的回应是

感谢您的反馈.我们将在future 的版本中考虑这一点,并且 我同意这将是一个有价值的补充.有很多种 不过,解决这个问题的办法并不高,所以我不认为它是高优先级的.例如. 使用日期维度表并在日期将其连接到LargeTable 纵队.在联接之前对日期维进行日期筛选.那条路 您可以在联接期间执行索引查找,以消除数据范围.

索引视图和列存储索引也可能对此有用 场景.

你知道竞争对手能不能做这个特定的问题 你描述的转变是什么?

在我看来,这确实像是在SQL Server2016的"它只是运行得更快"的界限下可以被考虑的那种事情,但想必它不是!

新的DATETRUNC函数也不是sargable的,但至少理解了何时对列应用DATETRUNC将保持该列的顺序-例如,avoid unnecessary sorts when grouping可以按年保持顺序.

如果要实现这一点,我认为它很可能通过使用dynamic seek mechanism来实现,其方式类似于CASTDATE的可移动性.

即使在这种情况下,直接将其表示为>= ... <范围仍然是more efficient,而不是仅仅依靠动态寻道来进行排序.

Sql相关问答推荐

如何计算帐户在SQL中随着时间的推移购买的SKU数量?

如何使用PostGIS从单个表中 Select 所有相交面组

如何在联接条件不匹配时按日期获取上一条记录

如何根据给定条件PostgreSQL迭代减少组中的行数

我希望以正确的升序获取SQL结果.怎样才能得到它们?

如何利用单列历史SQLsnowflake获得合并结果

替换上一个或下一个值中的空值并添加其价格日期

不同表达方式时的大小写

过go 四周未填充的数据,即W50,51,52-SQL

具有多个条件的SQL否定

当active=1时,是否可以创建id为的唯一索引?

Select 组中的第一行,但在并发环境中

在 PostgreSQL 中,如何让多个判断约束引用相同的值数组?

SQL 如何根据当前事件和下一个事件确定操作的持续时间?

在没有订单的情况下,如何生成一个值为0的顾客天数行

oracle中多行的跨日期范围的交集

在 SQL 查询中创建滚动日期

如何根据 Amazon Athena 中的多个列值删除重复行?

有条件求和

Lag() 获取snowflake的值变化