Wydajny sposób na porównanie dwóch dużych zestawów danych w SQL

12

Obecnie porównuję dwa zestawy danych, które zawierają unikalne StoreKey/ProductKeykombinacje.

Pierwszy zestaw danych zawiera unikalne StoreKey/ProductKeykombinacje sprzedaży od początku stycznia 2012 r. Do końca maja 2014 r. (Wynik = 450 tys. Linii). Drugi zestaw danych ma unikatowe StoreKey/ProductKeykombinacje, dla sprzedaży rozpoczynającej się w czerwcu 2014 r., Do dziś (wynik = 190 tys. Linii).

Szukam StoreKey/ProductKeykombinacji, które znajdują się w 2. zestawie, ale nie w 1. zestawie, tj. Nowe produkty sprzedawane od początku czerwca.

Do tej pory zrzuciłem dwa zestawy danych do tabel tymczasowych, utworzyłem indeksy dla obu tabel na obu kluczach i użyłem EXCEPTinstrukcji do znalezienia unikalnych elementów.

Jaki jest najbardziej efektywny sposób porównywania tak dużych zestawów danych? Czy istnieje bardziej skuteczny sposób wykonywania tego rodzaju dużych porównań?

Pierre Pretorius
źródło

Odpowiedzi:

10

Moim zdaniem skorzystanie z WYJĄTKU jest tutaj, ale warto rozważyć ponowne użycie tabeli tymczasowej. W ten sposób skutecznie kopiujesz swoje dane w pamięci, co spowalnia Cię. Jeśli potrzebne indeksy istnieją w tabelach źródłowych (jak podejrzewam), po prostu porównaj odpowiednie WYBÓR:

SELECT StoreKey,ProductKey FROM table WHERE sales BETWEEN date1 AND date2
EXCEPT
SELECT StoreKey,ProductKey FROM table WHERE sales BETWEEN date3 AND date4
Migoczą
źródło
1
Prawidłowo, tabela ma indeksy, ale jest to indeks klastrowy na dwóch wymaganych polach oraz pole o nazwie TransactionDateKey. Czy duża różnica byłaby widoczna, jeśli zaimplementuję: a.) Indeks klastrowy w StoreKey i ProductKey b.) Dwa oddzielne nieklastrowane indeksy odpowiednio w StoreKey i ProductKey?
Pierre Pretorius
1
Zakładam, TransactionDateKeyże kolumna służy do filtrowania okresu. W tym przypadku indeks klastra TransactionDateKey, StoreKeyi ProductKeyjest doskonały.
Twinkles,
1

Jeśli znasz algorytmy (złożoność Big-O), przeprowadzenie tego porównania jest w najlepszym wypadku O (n log (n)). Najbardziej wydajny algorytm posortuje oba zestawy danych, a następnie połączy je równolegle, aby znaleźć pasujące (lub niedopasowane) klucze. Większość optymalizatorów RDBMS zrobi to automatycznie, gdy używasz EXCEPTlub MINUS. Twój plan wyjaśniania potwierdzi lub odrzuci. Jeśli widzisz zagnieżdżone pętle, robisz O (n ^ 2), nie tak wydajne.

Joshua Huber
źródło
Dzięki Josua. Nie zna złożoności Big-O, ale na pewno się temu przyjrzy.
Pierre Pretorius
Linki, aby dowiedzieć się więcej o analizie złożoności, którą niektórzy określają potocznie jako Big-O. To nie jest tak trudne, jak mogłoby się początkowo wydawać. Kiedy ludzie mówią, że zadanie uruchomi się w czasie liniowym lub wielomianowym, właśnie o tym mówią. Tworzenie kopii zapasowej bazy danych jest zasadniczo liniowe, co oznacza, że ​​2x rozmiar bazy danych zajmuje 2x czas na wykonanie kopii zapasowej. Sortowanie danych nie jest jednak liniowe. Sortowanie pliku 2x większego zajmuje więcej niż 2x czasu. bigocheatsheet.com , w wiki en.wikipedia.org/wiki/Time_complexity wspomniano, że najszybszym możliwym rodzajem porównania jest „czas liniowo-rytmiczny ” = n log (n).
Joshua Huber