Le conseil actuel pour la manière la plus efficace de comparer deux grands ensembles de résultats / lignes semble être d'utiliser l' EXCEPT
opérateur. Ce script SQL autonome ci-dessous devient très inefficace à mesure que la taille des lignes augmente (modifiez les valeurs @last). J'ai essayé de trouver des entrées uniques dans une table combinée mais sans amélioration.
DECLARE @first AS INT, @step AS INT, @last AS INT;
-- This script is comparing two record sets using EXCEPT
-- I want to find additions from OLD to NEW
-- As number of rows increase performance gets terrible
-- I don't have to use two tables. I could use one combined table but I want the same result as quickly as possible
-- Compare 100 to 110 rows - 0 seconds
-- Compare 1000 to 1010 rows - 1 seconds
-- Compare 10000 to 10010 rows - 16 seconds
-- Compare 100000 to 100010 rows - ABORT after 8 minutes (tables are populated in 18 seconds)
DECLARE @temptableOLD TABLE ([Result1] int);
SET @step = 1; SET @first = 1; SET @last = 100000
WHILE(@first <= @last) BEGIN INSERT INTO @temptableOLD VALUES(@first) SET @first += @step END
DECLARE @temptableNEW TABLE ([Result1] int);
SET @step = 1; SET @first = 1; SET @last = 100010
WHILE(@first <= @last) BEGIN INSERT INTO @temptableNEW VALUES(@first) SET @first += @step END
select * from @temptableNEW
except
select * from @temptableOLD
la source
#temp
tables @WillHealey présentent de nombreux avantages par rapport aux variables de table (statistiques, parallélisme, indexation plus flexible), donc si vous ne l'utilisez pas dans un contexte où vous êtes limité aux variables de table, vous pouvez également les essayer.