SQL - vs PAS DANS
Supposons que j'ai un tableau avec une colonne qui prend les valeurs de 1 à 10. J'ai besoin de sélectionner les colonnes à toutes les valeurs, sauf pour les 9 et 10. Aura-t-il une différence (de performance) lorsque j'utilise cette requête:
SELECT * FROM tbl WHERE col NOT IN (9, 10)
et ce que c'est?
SELECT * FROM tbl WHERE col IN (1, 2, 3, 4, 5, 6, 7, 8)
BETWEEN 1 AND 8
serait probablement préférable, mais pas la peine de dépenser tout moment, même en tenant compte de la question d'une petite table. Est votre situation réelle différente?désolé, vous avez raison. la suppression de.
Smith - j'ai été en le considérant comme une situation théorique, je ne vais pas utiliser ces requêtes 🙂
La Performance peut varier largement en fonction du SGBD utilisé. Toujours vérifier le plan d'exécution d'abord, puis vous allez voir.
Aura-t-il une différence de performance? Très probablement, mais ce qui est plus rapide dépend de sql server que vous utilisez, comme c'est bon optimizer, votre index, et de la date et de l'exactitude de la ligne de statistiques, et la distribution de col valeurs.
OriginalL'auteur kyooryu | 2013-06-03
Vous devez vous connecter pour publier un commentaire.
Quand il s'agit de performance, vous devez toujours le profil de votre code (c'est à dire exécuter vos requêtes de quelques milliers de fois et mesurer à chaque boucle de rendement à l'aide d'une sorte de
stopwatch
. Exemple).Mais ici, je recommande fortement d'utiliser la première requête pour un avenir meilleur maintien. La logique est que vous avez besoin de tous les dossiers, mais 9 et 10. Si vous ajoutez de la valeur de 11 à votre table et à l'utilisation de la deuxième requête, la logique de votre application sera brisé qui va conduire à un bug, bien sûr.
Edit: je me souviens que c'était marqué que le php c'est pourquoi j'ai fourni des exemples en php, mais je peux me tromper. Je suppose qu'il ne sera pas difficile de réécrire l'échantillon dans la langue que vous utilisez.
OriginalL'auteur Leri
Utiliser "EN" car il sera très probablement faire le SGBD utiliser un index sur la colonne correspondante.
"NON" pourrait, en théorie, également se traduire par une utilisation des index, mais dans une plus compliqué qui SGBD peut pas "passer les frais généraux de l'heure" à l'aide de.
OriginalL'auteur Serge
J'ai vu Oracle ont de la difficulté à l'optimisation des requêtes avec PAS si les colonnes sont les valeurs null. Si vous pouvez écrire votre requête de toute façon, est préféré pour autant que je suis concerné.
OriginalL'auteur StilesCrisis
Pour une liste de constantes, MySQL en interne développez votre code:
De même pour l'autre, avec 8 fois
=
à la place.Donc oui, la première sera plus rapide, moins de comparaisons à faire. Les Chances qu'il soit mesurable sont négligeables cependant, la surcharge d'une poignée de comparaisons constantes n'est rien par rapport à la surcharge de l'analyse de SQL et de récupération des données.
IN
avec une liste de constantes est mis en œuvre à l'aide de binaires de recherche de la liste au lieu de 8=
comparaisons.Même si je n'ai jamais compter sur MySQL pour n'importe quel type de "avancée" de l'optimisation, le plus sûr hypothèse) il rend le second théoriquement légèrement plus lent, car il y a encore plus de comparaisons à faire.
OriginalL'auteur Niels Keurentjes