Un modo efficiente per confrontare due set di dati di grandi dimensioni in SQL
-
11-12-2019 - |
Domanda
Attualmente, sto confrontando due set di dati, che contengono combinazioni di generazione di StoreKey/ProductKey
uniche.
Il 1st Data Set ha le combinazioni di generatori di generazione esclusiva per le vendite tra il gennaio 2012 e la fine del maggio 2014 (risultato= 450k linee).Il 2 ° set di dati ha le combinazioni StoreKey/ProductKey
uniche, per le vendite iniziano a giugno 2014, fino ad oggi (risultato= linee 190k).
Sto cercando di trovare le combinazioni StoreKey/ProductKey
che si trovano nel 2 ° set, ma non nel 1 ° set - I.e. Nuovi prodotti venduti dall'inizio di giugno.
Fino ad ora, ho scaricato i due set di dati nelle tabelle TEMP, ha creato indici per entrambe le tabelle su entrambi i tasti e utilizzata l'istruzione StoreKey/ProductKey
per trovare elementi unici.
Qual è il modo più efficace per confrontare tali set di dati di grandi dimensioni? C'è un modo più efficiente di fare questo tipo di grande confronto?
Soluzione
L'uso eccetto è a mio avviso il modo di andare qui, ma potresti voler riconsiderare l'uso della tabella temporanea.In tal modo, stai esprimendo efficacemente i tuoi dati in memoria, che ti rallentano.Se gli indici necessari esistono sulle tabelle di origine (come sospetto), basta confrontare le selezioni appropriate:
SELECT StoreKey,ProductKey FROM table WHERE sales BETWEEN date1 AND date2
EXCEPT
SELECT StoreKey,ProductKey FROM table WHERE sales BETWEEN date3 AND date4
. Altri suggerimenti
Se hai familiarità con gli algoritmi (complessità Big-O), l'esecuzione di questo confronto è al meglio o (n log (n)).L'algoritmo più efficiente ordinerà sia i set di dati, quindi effettuare un flusso di fusioni in parallelo per trovare i tasti corrispondenti (o ineguagliabili).La maggior parte degli ottimizzatori RDBMS lo farà automaticamente per te quando si utilizza EXCEPT
o MINUS
.Il tuo programma di spiegazione confermerà o disconferò.Se vedi anelli nidificati, stai facendo o (n ^ 2), non così efficiente.