Un moyen efficace de comparer deux grands ensembles de données en SQL


12

Actuellement, je compare deux ensembles de données, qui contiennent des StoreKey/ProductKeycombinaisons uniques .

Le premier ensemble de données contient les StoreKey/ProductKeycombinaisons uniques de ventes entre début janvier 2012 et fin mai 2014 (résultat = 450 000 lignes). Le deuxième ensemble de données a les StoreKey/ProductKeycombinaisons uniques , pour des ventes débutant juin 2014, jusqu'à aujourd'hui (résultat = 190K lignes).

Je cherche les StoreKey/ProductKeycombinaisons qui se trouvent dans le 2ème set, mais pas dans le 1er set - c'est-à-dire les nouveaux produits vendus à partir de début juin.

Jusqu'à présent, j'ai vidé les deux ensembles de données dans des tables temporaires, créé des index pour les deux tables sur les deux clés et utilisé l' EXCEPTinstruction pour trouver des éléments uniques.

Quelle est la manière la plus efficace de comparer des ensembles de données aussi volumineux? Existe-t-il un moyen plus efficace de faire ce type de comparaison à grande échelle?

Réponses:


10

Utiliser EXCEPT est à mon avis la voie à suivre ici, mais vous voudrez peut-être reconsidérer l'utilisation de la table temporaire. Ce faisant, vous dupliquez efficacement vos données en mémoire, ce qui vous ralentira. Si les index dont vous avez besoin existent sur les tables source (comme je le soupçonne), comparez simplement les SELECTS appropriés:

SELECT StoreKey,ProductKey FROM table WHERE sales BETWEEN date1 AND date2
EXCEPT
SELECT StoreKey,ProductKey FROM table WHERE sales BETWEEN date3 AND date4

1
Exact, la table a des index, mais c'est un index clusterisé sur les deux champs obligatoires, plus un champ nommé TransactionDateKey. Y aurait-il une grande différence si j'implémentais: a.) Un index cluster sur StoreKey et ProductKey b.) Deux index non cluster séparés sur StoreKey et ProductKey respectivement?
Pierre Pretorius

1
Je suppose que TransactionDateKeyc'est la colonne utilisée pour filtrer la période. Dans ce cas, l'index clusterisé sur TransactionDateKey, StoreKeyet ProductKeyest parfait.
Twinkles

1

Si vous êtes familier avec les algorithmes (complexité Big-O), effectuer cette comparaison est au mieux O (n log (n)). L'algorithme le plus efficace triera les deux ensembles de données, puis effectuera une analyse fusionnée en parallèle pour trouver les clés correspondantes (ou inégalées). La plupart des optimiseurs RDBMS le feront automatiquement pour vous lorsque vous utilisez EXCEPTou MINUS. Votre plan d'explication confirmera ou infirmera. Si vous voyez des boucles imbriquées, vous faites O (n ^ 2), pas aussi efficace.


Merci Josua. Je ne connais pas la complexité de Big-O, mais je vais certainement y jeter un œil.
Pierre Pretorius

Liens pour en savoir plus sur l'analyse de complexité, que certaines personnes appellent familièrement Big-O. Ce n'est pas aussi difficile qu'il y paraît au premier abord. Quand les gens disent qu'une tâche s'exécutera en temps linéaire ou en temps polynomial, c'est à cela qu'ils font référence. La sauvegarde de la base de données en général est linéaire, ce qui signifie que la taille de la base de données 2x prend 2x fois le temps de la sauvegarde. Cependant, le tri d'un ensemble de données n'est pas linéaire. Un fichier 2x plus gros prend plus de 2x pour trier. bigocheatsheet.com , dans le wiki en.wikipedia.org/wiki/Time_complexity, il mentionne que le tri de comparaison le plus rapide possible est "temps linéaireithmique" = n log (n).
Joshua Huber
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.