1

我有很多存储过程遵循选择日期列是最新到某个日期的行的模式,包括在内。我看到有两种形式在使用:

select top 1 x, y, z from sometable where a=b and date <= @date order by date desc

或者

select x, y, z from sometable where a=b and date=(select max(date) from sometable where a=b and date <= @date)

我可以想象第二种形式的派生,它也使用连接而不是子查询。

我们可以忽略第二种形式可能返回多行的情况。假设它永远不会。

由于这在很多地方使用,其中一些针对性能关键代码中的大量行,我想标准化哪个是更优化的解决方案(这可能是其他一些建议)。

一些谷歌搜索已经找到了 TOP 1 与 MAX 的大量比较,但通常是针对单个值,没有子查询。在这种情况下,MAX 是明显的赢家,但我不确定子查询是否会改变这一点。

我很欣赏在这方面比我更博学的人的观点(应该是你们中的大多数人!)。

4

2 回答 2

2

您的结果可能因表设计而异,但一般来说,当日期没有索引时,TOP 1 / Order by 技术要好 2 倍,因为 SQL 服务器必须对每个查询进行扫描 - 首先找到最大日期,然后根据它查找其余的值。当日期上有索引时(无论它是否涵盖查询),计划是相同的。

这里要考虑的最重要的事情是索引。如果此查询要执行很多次,您需要确保索引日期字段。

无论是从 TOP 1 在某些情况下是最佳的角度来看,还是您已经谈到的问题:MAX 可能返回超过 1 行(顺便说一下,除非有唯一索引,否则不要假设它不会有朝一日日期),我绝对更喜欢 TOP 1 技术 - 这是我用于所有此类查询的技术。

于 2009-08-12T12:58:31.373 回答
1

查询优化器有很大的自由度,它可以以各种方式执行 MAX 或 TOP 1。它的确切作用取决于源查询、可用索引和表的统计信息等。明天它可能会选择不同的方法,因为你的桌子的大小或它的分布发生了变化。

所以我认为没有一个最佳解决方案。等待实际性能问题,一一优化。

于 2009-08-12T09:01:31.083 回答