我一些优化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