我阅读此页有关适用于:WHERE和ON子句执行的顺序是什么?
和我读到这篇文章的逻辑查询处理:
所以我能理解这个查询如何需要很长的时间。
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'
的加盟经历的所有行,然后的 WHERE子句对结果进行过滤。
但为什么这个查询闪电般快?
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'
AND s.StartedAt BETWEEN '20080630 23:45' AND '20080701 03:00'
我得到的是WHERE子句过滤两个表的结果。但 JOIN之后发生过滤发生,而不是之前它。现在,如果它以某种方式实际发生在JOIN之前,那么我肯定明白它为什么如此之快。但是,如果我在第二环节通过LOE,情况不应该如此。对?
我们可以选择表结构吗?如果查询速度非常快,那么最可能的索引是最优的。小一些。如果没有表格定义,很难确定。 –
您需要查看解释以查看优化器在做什么。由于您的连接是内部连接,因此优化器很可能会重新编写您的查询。 – Andrew
您检查了执行计划吗?你应该看看关于sql server enginer和optimizer的文章。我认为它总是会尝试执行第一个index_seek,然后table_scan,据我所知,如果您正在基于索引和连接子句基于非索引列运行where子句,它将首先执行where子句。嗯再读你的查询,我会说优化器做了一个很好的工作,你没有平等但>和所以它首先减少2临时表,然后加入他们比较值。这对我来说似乎是正确的 –