私はいくつかのSQLクエリを最適化しており(これは私が最近投稿した質問のパート2と見なすことができます)、いくつかのNOTINをNOTEXISTS述語に置き換えています
そうすることの主な利点は、NOT EXISTSを使用すると、単一の一致が見つかったときにステートメントが終了するという利点が得られることですが、カウントサブクエリを使用したNOT INは、全表スキャンを実行する必要があると思いますか?
また、選択したデータにNULLが含まれている場合、NOT INにも追加の作業が必要になるようですが、これは正しいですか?
procに実装する前に、これら2つのケースで2番目のステートメントが最初のステートメントよりも優れている(そして機能的に同等である)ことを確認する必要があります。
ケース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)
乾杯