2012-11-29 132 views
0

我有兩個SQL查詢如下比較查詢

SELECT rc.stateId,rs.stateName FROM 
(SELECT DISTINCT cityid FROM HolidayPackageCity) AS hpc 
INNER JOIN 
(SELECT cityid,stateid FROM RegCity WHERE countryCode='IN' AND stateId IS NOT NULL) AS rc 
ON hpc.cityId=rc.cityId 
INNER JOIN 
RegState AS rs 
ON rc.stateId=rs.stateId 

VS

SELECT DISTINCT rc.stateId,rs.stateName 
FROM HolidayPackageCity AS hpc 
INNER JOIN 
    RegCity AS rc 
    ON hpc.cityId=rc.cityId 
    INNER JOIN 
    RegState AS rs 
    ON rc.stateId=rs.stateId 
WHERE rc.countryCode='IN' AND rc.stateId IS NOT NULL 

在第一查詢第一i-過濾特定表的數據然後應用加入和第一在第二表我申請加入,然後我應用條件來過濾數據。 我想知道的是從哪一個和爲什麼哪個更快。

+3

如果你想知道哪一個是快,你可以在你的SQL客戶端查看執行時間 –

+1

您還可以檢查'EXPLAIN'命令對於每個查詢,顯示的步驟,該數據庫需要執行查詢。只需在查詢前放置'EXPLAIN'關鍵字即可。 –

+0

是解釋存在於SQL 2008(我不能夠使用它) – Vishwajeet

回答

1

第二次查詢速度更快,因爲優化器會先用WHERE子句過濾表,然後創建,後來用於連接內部臨時表。結論 - 更好的解決方案是加入包含較小數據集的表。

順便說一句,優化更容易處理第二查詢,其中沒有包含的子查詢。

+1

完美..... + 1 – Dejan

0

可以顯示在SQL Server 2008中的執行計劃有一個按鈕某處。只需將這兩個查詢放在同一個窗口中,它就會告訴你哪個時間花費在每個窗口上。結果的正確性可能取決於實際需要超過一毫秒或兩個毫秒的查詢。

我相信第二個查詢爲優化器提供了更多的自由度,而第一個查詢會迫使它進入一些可能效率低下的路徑(但它也可以強制它成爲優化器不會嘗試的更有效的路徑)。我很確定效率的差異取決於表佈局,但我懷疑優化後的查詢對於這樣一個簡單的查詢效率會低很多。

請注意(根據我的觀點),關於SQL的一件大事並不是告訴它如何做,而只是讓優化器處理它,所以第二個查詢是首選的(儘管優化器並不總是很好因此我建議讓優化器處理它,做一些壓力測試,看看事情是否緩慢,也許使用分析器來識別有問題的查詢,並強制它成爲一個更有效的路徑)。

0

一般的規則是,子查詢會慢一些,特別是如果使用正確的索引連接。