我閱讀此頁有關適用於: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臨時表,然後加入他們比較值。這對我來說似乎是正確的 –