我的老闆給我們發送了查詢,並要求我們用更高效的版本來替換它,並實現以下目標:如何改進此SQL?
從具有至少1紀錄
PASS_PACKAGE_DETAILS
表PACKAGE
表獲取所有記錄。
由於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
方法。
你看過查詢的3個變體的查詢執行計劃嗎? – Jackson
比較執行計劃,並用類似於實際數據的數據進行測試。當它可以被測量時,不需要假設哪一個是最好的。 –
我正在使用SQL管理工作室。我的執行時間有點奇怪。對於使用IN方法,第一次執行將使我大約90+毫秒,第二次執行使我像200毫秒,第三次執行回到90+毫秒。所以我不知道我應該參考哪個執行時間。 – VincentPzc