Comparer un tableau avec une "très grande" table d'une database SQL Server

Dans un programme C # j'ai un tableau avec environ 100.000 éléments.

Ensuite, j'ai une table SQL Server 2008 où la colonne de key primaire contient plus ou less tous les éléments du tableau (mais pas certains). La table peut avoir jusqu'à 30.000.000 lignes.

Maintenant, je veux déterminer quels éléments du tableau n'existent pas dans la table. Comment cela peut-il être réalisé efficacement?

La méthode la plus efficace consisterait probablement à insert en bloc ces 100 000 éléments dans une table temporaire, puis à effectuer la comparaison dans la database elle-même.

(Notez que je n'ai pas testé cette théorie, c'est juste une supposition éclairée.)

Interroger la table avec un

 select <primarykey> where <primarykey> in (<primary key of ur list of elements in c#>) 

Cela devrait être plus rapide que d'insert toutes les lignes dans une table, puis vérifier avec une command except / minus pour les éléments manquants, car cela n'implique aucune opération d'écriture.

Une fois que vous avez la list des keys primaires qui sont communs, returnnez-les dans c # et comparez.

Un moyen d'éviter la création de tables temporaires consisterait à utiliser une procédure stockée qui accepte un paramètre de valeur table d'un type de table défini par l'user (udtt). Cette table aurait un schéma d'une colonne d'un type de données correspondant à celle de votre tableau.

Si vous remplissez un DataTable (avec un schéma correspondant au schéma udtt) avec vos valeurs de tableau et fournissez la table de données en tant que paramètre de votre proc stocké, vous pouvez passer tous les 100 000 de vos éléments dans leur format binary sql. Le proc peut simplement faire une jointure entre la table de ligne 30M et le paramètre table, renvoyant les éléments de la table TVP sans correspondance dans la table principale.

Cela évite d'avoir à build des instructions IN massives.

EDIT Concernant le commentaire de @Kyro ci-dessous

Je suis maintenant less confiant dans cette approche. J'ai trouvé un article montrant les inserts rangée par rangée que Kyro décrit. Ce que vous pourriez gagner en envoyant des données binarys sur le réseau plutôt qu'un grand TSQL where in() instruction where in() peut être retirée par le côté SQL de performance. Cependant, il s'agit d'une approche de code assez simple, ce qui pourrait valoir un test rapide. Fais nous savoir comment tu reussis?