TOP,DESC和CROSS APPLY如何使这个查询更快?

时间:2013-12-11 14:48:49

标签: sql sql-server tsql cross-apply

与此问题相关:In what order does execution on WHERE and ON clauses work?

我正在阅读此页面关于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'

我不知道要问什么具体问题,因为我没有得到它。

1 个答案:

答案 0 :(得分:4)

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