Y a-t-il des différences (perf) enrichissant cette demande:
Select * from T where PK in (1)
3 Réponses :
Dans votre cas: Aucune différence p>
En général: Vous pouvez écrire un sous-sélection ou à l'intérieur des accolades, et = code> échouera si ce sous-cote retourne plus d'une ligne. De plus, vous pouvez écrire (1,2) code> (ce serait comme un sous-sélection qui renvoie 2 lignes), où = code> n'est pas possible. P>
Thx, je sais utiliser dans et '='. Je me demandais juste s'il y aurait une différence parfaite
L'expression dans l'expression: est réécrit en interne à quelque chose de très similaire à: p> Vous pouvez le dire parce que, si vous Fournissez le nom d'une colonne inexistante, le nombre d'erreurs rapportées ( 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. P> 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). P> p> Nom de colonne non valide 'bla' code>) 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. P>
Opérateur de comparaison qui compare deux valeurs pour l'égalité est le moyen le plus rapide de faire la comparaison. P>
"Sélectionnez * de T où pk = 1" p>
préfère beaucoup plus vite que: p>
"Sélectionnez * de T où pk in (1)" p>
une même que: p>
"Sélectionnez Customer_Number, Nom de la clientèle du client où Customer_Number entre 1000 et 1004" P>
préfère beaucoup plus vite que: p>
"Sélectionnez Customer_Number, Nom de la clientèle du client où Customer_Number In (1000, 1001, 1002, 1003, 1004)" P>
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. P>
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. :-)
J'espère que l'optimisateur reconnaîtrait qu'il n'y a qu'une seule valeur dans votre liste
dans la liste code> et le traite de la même manière que celle-ci= code>.Alors, c'est moi, mais comment puis-je l'affirmer?