2015-04-23 89 views
-1

我的老闆給我們發送了查詢,並要求我們用更高效的版本來替換它,並實現以下目標:如何改進此SQL?

從具有至少1紀錄PASS_PACKAGE_DETAILSPACKAGE表獲取所有記錄。

由於SQL:

SELECT DISTINCT 
    pckg.* 
FROM 
    PASS_PACKAGE pckg 
JOIN 
    PASS_PACKAGE_DETAILS pckg_dtl ON (pckg.PACKAGE_ID = pckg_dtl.PACKAGE_ID) 
WHERE 
    IS_ACTIVE = 1 
    AND '2015/04/22' BETWEEN DATE_START AND DATE_END 
ORDER BY 
    PACKAGE_NAME 

糾正我,如果我錯了,但我相信上面的查詢將降低性能由於JOIN方法。在閱讀this之後,我想知道我的哪個查詢確實實現了我的上司要求以及爲什麼。

我的SQL:

嘗試#1 - 使用IN

SELECT 
    pckg.* 
FROM 
    PASS_PACKAGE pckg 
WHERE 
    IS_ACTIVE = 1 
    AND '2015/04/22' BETWEEN DATE_START AND DATE_END 
    AND pckg.PACKAGE_ID IN (SELECT DISTINCT pckg_dtl.PACKAGE_ID 
          FROM PASS_PACKAGE_DETAILS pckg_dtl) 
ORDER BY 
    PACKAGE_NAME 

嘗試#2 - 使用EXISTS

SELECT 
    pckg.* 
FROM 
    PASS_PACKAGE pckg 
WHERE 
    IS_ACTIVE = 1 
    AND '2015/04/22' BETWEEN DATE_START AND DATE_END 
    AND EXISTS (SELECT pckg_dtl.PACKAGE_ID 
       FROM PASS_PACKAGE_DETAILS pckg_dtl 
       WHERE pckg_dtl.package_id = pckg.package_id) 
ORDER BY 
    PACKAGE_NAME 

希望得到專家在這裏一些有價值的信息!

編輯:我正在使用SQL Server Management Studio。我的執行時間有點奇怪。對於IN方法,第一次執行將花費大約90+ ms,第二次執行像200 ms,第三次執行回到90+ ms。所以我不確定我應該參考哪個執行時間。方法同樣適用於EXISTS方法。

+1

你看過查詢的3個變體的查詢執行計劃嗎? – Jackson

+1

比較執行計劃,並用類似於實際數據的數據進行測試。當它可以被測量時,不需要假設哪一個是最好的。 –

+0

我正在使用SQL管理工作室。我的執行時間有點奇怪。對於使用IN方法,第一次執行將使我大約90+毫秒,第二次執行使我像200毫秒,第三次執行回到90+毫秒。所以我不知道我應該參考哪個執行時間。 – VincentPzc

回答

-1

existsin是等價的,它們都充其量最適合連接,最壞的情況下......呃,不是。

你花了好幾分鐘打字整個帖子,我建議看看執行計劃,而不是更好地利用你的時間。您在「我相信」(甚至在閱讀其餘部分並看到您錯誤之前)中失去了所有可信度,而不是顯示硬數據來支持每個備選方案。

編輯:注意這些查詢是不相同的。最上面的一個做了額外的(無用的)排序和過濾(distinct),其他兩個沒有。