Pracuję nad generowaniem raportów dla danych zawartych w dużej wcześniej istniejącej bazie danych programu Access (~ 500 MB po kompaktowej naprawie &) i mam problem z wolnym podzapytaniem .Bardzo wolne podzapytania przy korzystaniu z "NOT IN"
Baza danych zawiera dużą tabelę, która zawiera zapis każdego zakupu klienta. Oto prosta kwerenda, która znajduje klientów, którzy kupili niebieski widget. Kończy się w ciągu kilku sekund i zwraca około dziesięciu tysięcy rekordów.
SELECT DISTINCT CustomerId
FROM ProductSales
WHERE Product = 'BLUE'
Oto zapytanie, które próbuje znaleźć klientów, którzy kupili niebieski widget, ale nie czerwony widget. Uruchomienie trwa około godziny.
SELECT DISTINCT CustomerId FROM ProductSales
WHERE Product = 'BLUE'
AND CustomerId NOT IN (
SELECT CustomerId
FROM ProductSales
WHERE Product = 'RED'
)
Czy istnieje sposób na zreorganizowanie drugiego zapytania, aby potrwać kilka minut zamiast godziny?
Zakładam, że pole CustomerId zawiera indeksy w obu tabelach? –
Czy próbowałeś WYBIERZ ODLEGŁOŚĆ CustomerId FROM ProductSales WHERE Product = 'BLUE' minus WYBIERZ CustomerId FROM ProductSales WHERE Product = 'RED'. Widziałem przypadki, w których naprawdę przyspieszyło to zapytanie, ale YMMV –
@Marc B: Tutaj jest tylko jedna tabela, ale CustomerId jest na niej indeksowany. – James