-2

与此问题相关:WHERE 和 ON 子句的执行顺序是什么?

我正在阅读有关 APPLY 的页面:

http://sqlblog.com/blogs/alexander_kuznetsov/archive/2009/07/07/using-cross-apply-to-optimize-joins-on-between-conditions.aspx

而且我不明白 CROSS APPLY、TOP 和 DESC 如何使这个查询更快。

原始查询:

 SELECT s.StartedAt, s.EndedAt, c.AirTime 
FROM dbo.Commercials s JOIN dbo.Calls c  
  ON c.AirTime >= s.StartedAt AND c.AirTime < s.EndedAt 
WHERE c.AirTime BETWEEN '20080701' AND '20080701 03:00'

更快的查询:

SELECT s.StartedAt, s.EndedAt, c.AirTime 
FROM dbo.Calls c CROSS APPLY( 
  SELECT TOP 1 s.StartedAt, s.EndedAt FROM dbo.Commercials s  
  WHERE c.AirTime >= s.StartedAt AND c.AirTime < s.EndedAt 
  ORDER BY s.StartedAt DESC) AS s 
WHERE c.AirTime BETWEEN '20080701' AND '20080701 03:00'

我不知道要问什么具体问题,因为我不明白。

4

1 回答 1

4

您的第二个查询可能更快,因为您将要加入的结果集限制为最多 1 行;第一行。几乎不需要计算或连接匹配。在这种情况下,你CROSS APPLY的行为就像一个奇异的函数。

于 2013-12-11T14:54:52.207 回答