Quel est l'algorithme interne du fonctionnement de l' opérateur Except sous les couvertures de SQL Server? Faut-il en interne un hachage de chaque ligne et comparer?
David Lozinksi a mené une étude, SQL: le moyen le plus rapide d'insérer de nouveaux enregistrements là où il n'y en a pas déjà. Il a montré que l'instruction Except est la plus rapide pour les lignes à grand nombre; étroitement lié à nos résultats ci-dessous.
Hypothèse: je pense que la jointure gauche serait la plus rapide, car elle ne compare qu'une seule colonne, sauf qu'elle prendrait le plus de temps, car elle doit comparer toutes les colonnes.
Avec ces résultats, maintenant notre pensée est Exceptée automatiquement et prend en interne un hachage de chaque ligne? J'ai regardé Except plan d'exécution et il utilise un peu de hachage.
Contexte: Notre équipe comparait deux tables de tas. Tableau A Les lignes ne figurant pas dans le tableau B ont été insérées dans le tableau B.
Les tables de tas (du système de fichiers texte hérité) n'ont pas de clés primaires / guides / identificateurs. Certaines tables avaient des lignes en double, nous avons donc trouvé le hachage de chaque ligne, supprimé les doublons et créé des identificateurs de clé primaire.
1) Nous avons d'abord exécuté une instruction except, excluant (colonne de hachage)
select * from TableA
Except
Select * from TableB,
2) Ensuite, nous avons exécuté une comparaison de jointure gauche entre les deux tables sur le HashRowId
select *
FROM dbo.TableA A
left join dbo.TableB B
on A.RowHash = B.RowHash
where B.Hash is null
étonnamment, l'insertion de déclaration Except était la plus rapide.
Les résultats sont proches des résultats des tests de David Lozinksi