我一些優化SQL查詢(這可以被認爲是一個問題,我最近公佈的第2部分),並更換一些不符合NOT EXISTS謂詞NOT EXISTS VS NOT IN
我是正確的思維,主受益於這樣做是與NOT EXISTS你得到的好處是,當一個找到匹配的聲明會終止,但不與計數子查詢將不得不做全表掃描?
它似乎也不需要額外的工作,如果選擇的數據包含NULL,這是正確的嗎?
我需要確保的是,第二條語句比這兩種情況下,第一(和功能上等同)更好的之前,我實現它們在proc:
案例1:
--exclude sessions that were tracked as part of a conversion during the last response_time minutes
-- AND session_id NOT IN (SELECT DISTINCT tracked_session_id
-- FROM data.conversions WITH (NOLOCK)
-- WHERE client_id = @client_id
-- AND utc_date_completed >= DATEADD(minute, (-2) * cy.response_time, @date)
-- AND utc_date_completed <= @date
-- AND utc_date_clicked <= @date)
AND NOT EXISTS (SELECT 1
FROM data.conversions WITH (NOLOCK)
WHERE client_id = @client_id
AND utc_date_completed >= DATEADD(minute, (-2) * cy.response_time, @date)
AND utc_date_completed <= @date
AND utc_date_clicked <= @date
AND data.conversions.tracked_session_id = d.session_id
)
案例2 :
-- NOT EXISTS vs full table scan with COUNT(dashboard_id)
-- AND (SELECT COUNT(dashboard_id)
-- FROM data.dashboard_responses WITH(NOLOCK)
-- WHERE session_id = d.session_id
-- AND cycle_id = cy.id
-- AND client_id = @client_id) = 0
AND NOT EXISTS(SELECT 1
FROM data.dashboard_responses
WHERE session_id = d.session_id
AND cycle_id = cy.id
AND client_id = @client_id)
乾杯
是否執行計劃不會告訴你如果不只會產生一個不同的計劃,更聰明執行表掃描?我會親自看看計劃中有關性能/ IO統計數據的內容。 –
可能的重複[有什麼區別不存在與不存在與左連接是NULL?](http://stackoverflow.com/questions/2246772/whats-the-difference-between-not-exists-vs – GarethD
不幸的是,我不能(輕鬆地)針對數據源運行這些存儲過程以獲得查詢計劃 – managedheap84