Очень медленные подзапросы при использовании «NOT IN»

Я работаю над созданием отчетов для данных, содержащихся в большой уже существующей базе данных Access (~ 500 МБ после сжатия и восстановления), и у меня проблемы с медленным подзапросом.

В базе данных есть большая таблица, которая содержит записи о каждой покупке клиента. Вот простой запрос, который находит клиентов, купивших синий виджет. Он завершается в течение нескольких секунд и возвращает около десяти тысяч записей.

SELECT DISTINCT CustomerId 
FROM ProductSales
WHERE Product = 'BLUE' 

Вот запрос, который пытается найти клиентов, которые купили синий виджет, но не красный виджет. Выполнение занимает около часа.

SELECT DISTINCT CustomerId FROM ProductSales
WHERE Product = 'BLUE' 
AND CustomerId NOT IN (
    SELECT CustomerId 
    FROM ProductSales 
    WHERE Product = 'RED'
)

Есть ли способ рефакторинга второго запроса, чтобы он занимал несколько минут вместо часа?

7
задан James 9 August 2011 в 16:58
поделиться