Pourquoi le Select * from Table where ID not IN ( liste de int id) de la requête est lent dans sql server ce?
bien ce problème est général dans sql server ce
j'ai l'index sur tous les champs.
aussi la même requête mais avec l'ID DANS la liste des int id) est assez rapide.
j'ai essayé de changer la requête de Jointure EXTERNE mais cela c'est encore pire.
donc tous les conseils sur pourquoi cela arrive et comment résoudre ce problème?
OriginalL'auteur Karim | 2010-08-23
Vous devez vous connecter pour publier un commentaire.
C'est parce que l'index n'est pas vraiment utile pour ce genre de requête, de sorte que la base de données a pour objectif de faire une analyse de la table. Si la requête est (pour quelque raison) plus lent qu'un simple "SELECT * from TABLE", le faire à la place et de filtrer les indésirables Id dans le programme.
EDIT: par votre commentaire, je vous reconnais utiliser une sous-requête au lieu d'une liste. À cause de cela, il y a trois façons possibles de faire de même (j'espère que l'un d'entre eux est le plus rapide):
Original de la déclaration:
Variante 1:
Variante 2:
La variante 3: (laid et difficile à comprendre, mais si tout le reste échoue...)
ouais plus lent puis un select * sans aucune condition. la sélection normale * prend comme 1 seconde. select * where id not in (sous sélectionnez [qui est rapide par lui-même]) prend plus de 30 secondes. le nombre total de lignes dans la table est 12734
merci pour les exemples. en fait, je vais essayer mais j'ai été en utilisant la variante 3 et il a été rapide, mais quand j'ai essayé de jointure externe sur 2 tables puis il a commencé à être très lent (plus de 30 secondes). la chose étrange est que je pense que le "where id pas dans" la requête doit être rapide à exécuter, même sur une analyse de la table, je ne comprends pas pourquoi il est si lent sur sql server ce. et la chose étrange est que je n'ai pas trouver d'information sur cette slowliness sur internet, suis-je le seul qui est d'essayer d'utiliser "id not in(select)" sur sql server ce dans le monde entier?
Vous n'avez pas mentionné la sous-sélection avant....
Original de la déclaration a fonctionné pour moi merci....
OriginalL'auteur Erich Kitzmueller
Ce n'est pas un problème dans SQL Server CE, mais dans l'ensemble de la base de données.
L'OPÉRATION est sargable et N'EN est nonsargable.
Ce que cela signifie ?
ARGument de recherche de Pouvoir, thiès dire que SGBD moteur peut prendre avantage de l'utilisation de l'index, pour les Non ARGument de Recherche Ablee l'index ne peut pas être utilisé.
La solution serait peut-être à l'aide de l'instruction de filtrage pour supprimer les codes
Plus dans SQL optimisation des Performances par Peter Gulutzan.
OriginalL'auteur Damian Leszczyński - Vash
ammoQ est à droite, l'index n'a pas beaucoup d'aide avec votre requête. En fonction de la distribution des valeurs dans votre colonne ID, vous pourriez optimiser la requête en précisant l'Id de sélectionner plutôt que de ne pas la sélectionner. Si vous finissez par vous demander d'en dire plus à ~25% de l'indice dans la table ne sera pas utilisé de toute façon, mais parce que pour les non-cluster indexé (qui est le seul type de l'index SQL qui CE prend en charge si ma mémoire est bonne), il serait moins coûteux pour l'analyse de la table. Sinon (si la requête est en fait sélective), vous pouvez ré-écrire des requêtes avec des plages d'ID de choisir (union des tous les "peut mieux" ou "pour combiner les plages si SQL CE partisan de l '"union de tous", pas sûr)
OriginalL'auteur vaso