web-dev-qa-db-fra.com

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

Actuellement, je compare deux ensembles de données, qui contiennent des combinaisons StoreKey/ProductKey Uniques.

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

Je cherche les combinaisons StoreKey/ProductKey Qui sont 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'instruction EXCEPT pour rechercher 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?

12
Pierre Pretorius

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
10
Twinkles

Si vous connaissez 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 EXCEPT ou MINUS. Votre plan d'explication confirmera ou infirmera. Si vous voyez des boucles imbriquées, vous faites O (n ^ 2), pas aussi efficace.

1
Joshua Huber