6
votes

Y a-t-il une différence entre '=' et dans?

Y a-t-il des différences (perf) enrichissant cette demande:

Select * from T where PK in (1)


2 commentaires

J'espère que l'optimisateur reconnaîtrait qu'il n'y a qu'une seule valeur dans votre liste dans la liste et le traite de la même manière que celle-ci = .


Alors, c'est moi, mais comment puis-je l'affirmer?


3 Réponses :


3
votes

Dans votre cas: Aucune différence

En général: Vous pouvez écrire un sous-sélection ou à l'intérieur des accolades, et = échouera si ce sous-cote retourne plus d'une ligne. De plus, vous pouvez écrire (1,2) (ce serait comme un sous-sélection qui renvoie 2 lignes), où = n'est pas possible.


1 commentaires

Thx, je sais utiliser dans et '='. Je me demandais juste s'il y aurait une différence parfaite



3
votes

L'expression dans l'expression: xxx

est réécrit en interne à quelque chose de très similaire à: xxx

Vous pouvez le dire parce que, si vous Fournissez le nom d'une colonne inexistante, le nombre d'erreurs rapportées ( Nom de colonne non valide 'bla' ) est égal au nombre de valeurs dans la liste dans la liste dans la liste. Bien entendu, une telle réinscription ne se produit que pour des listes de valeurs littérales. Les sous-requéries (comme @oezi dit) sont traitées différemment.


Bien entendu, cette optimisation particulière n'est pas documentée et il est toujours préférable d'écrire le code le plus clair possible.

Je ne sais pas s'il y a une limite supérieure où elle n'effectuera pas cette expansion - elle le fera certainement jusqu'à 100 valeurs de la liste dans la liste (et je ne peux pas être dérangée de taper plus).


0 commentaires

-1
votes

Opérateur de comparaison qui compare deux valeurs pour l'égalité est le moyen le plus rapide de faire la comparaison.

"Sélectionnez * de T où pk = 1"

préfère beaucoup plus vite que:

"Sélectionnez * de T où pk in (1)"

une même que:

"Sélectionnez Customer_Number, Nom de la clientèle du client où Customer_Number entre 1000 et 1004"

préfère beaucoup plus vite que:

"Sélectionnez Customer_Number, Nom de la clientèle du client où Customer_Number In (1000, 1001, 1002, 1003, 1004)"

L'optimiseur de requête peut localiser une gamme de nombres beaucoup plus rapidement (en utilisant entre) qu'il ne peut trouver une série de nombres à l'aide de la clause IN.


3 commentaires

Ok, mais comment pouvez-vous le prouver?


OK, Damien_the_unbeliever a raison, je viens d'enregistrer dans un plan d'exécution "Select * de T où pk in (1)" est exécuté / traduit par "Sélectionnez * de T où pk = 1", c'est-à-dire que la requête Optimizer a fait son travail. Les sous-sollicitations in Clause sont traitées différemment.


Seule chose qui pourrait être plus rapide si quand la requête est analysée. :-)