SQL - Améliore les performances des requêtes NOT EXISTS
Est-il un moyen pour que je puisse améliorer ce genre de performances des requêtes SQL:
INSERT
INTO ...
WHERE NOT EXISTS(Validation...)
Le problème, c'est quand j'ai beaucoup de données dans ma table (comme des millions de lignes), l'exécution de la WHERE NOT EXISTS
clause si elle est très lente. Je dois faire cette vérification car je ne peux pas insérer des données dupliquées.
J'utilise sql server 2005
thx
source d'informationauteur Melursus
Vous devez vous connecter pour publier un commentaire.
Assurez-vous que vous êtes à la recherche sur des colonnes indexées, sans aucune manipulation des données au sein de ces colonnes (comme sous-chaîne, etc.)
Sur le dessus de ma tête, vous pouvez essayer quelque chose comme:
Essayer de remplacer la n'EXISTE PAS avec une jointure externe gauche, il est parfois plus performant dans de grands ensembles de données.
Attention à l'autre réponse sur l'indexation. N'EXISTE PAS est généralement assez rapide si vous avez de bons indices.
Mais je ont avait des problèmes de performances avec des déclarations comme vous le décrivez. Une méthode que j'ai utilisé pour contourner ce problème c'est d'utiliser une table temporaire pour le candidat, de valeurs, de SUPPRIMER à PARTIR de ... OÙ EXISTE (...), puis à l'aveuglette INSÉREZ le reste. À l'intérieur d'une transaction, bien sûr, afin d'éviter des conditions de course. L'éclatement des requêtes parfois, permet à l'optimiseur de faire son travail sans se confondre.
Si vous le pouvez à tout réduire le problème de l'espace, alors vous allez gagner des tas de performance. Êtes-vous absolument sûr que chacun de ces lignes dans cette table doit être vérifiée?
L'autre chose que vous pourriez vouloir essayer est un
DELETE InsertTable FROM InsertTable INNER JOIN ExistingTable ON <Validation criteria>
avant de votre insert. Cependant, votre kilométrage peut varier..peut-être plus efficace. Comme d'autres l'ont dit, assurez-vous que vous avez des indices sur tous les champs de recherche.