les instructions sql avec est égale à vs en

Dire que quelqu'un est venu à vous et dit que nous allions couper vers le bas le montant de SQL qui nous écrire par le remplacement égal à égal avec IN. L'utilisation serait à la fois pour des valeurs scalaires, et des listes de numéros.

SELECT * 
  FROM table 
 WHERE id = 1

OU

SELECT * 
  FROM table 
 WHERE id IN (1)

Sont ces instruction équivalent à ce que l'optimiseur de produit?

Cela ressemble vraiment simple sur la surface, mais elle conduit à une simplification pour deux raisons: 1. de gros blocs de SQL n'a pas besoin d'être dupliqué, et 2. nous n'abusez pas du SQL dynamique.

C'est un exemple artificiel, mais de considérer les éléments suivants.

select a.* from tablea a 
join tableb b on a.id = b.id
join tablec c on b.id2 = c.id2
left join tabled d on c.id3 = c.id3
where d.type = 1

... et la même chose pour les plus d'un cas

select a.* from tablea a 
join tableb b on a.id = b.id
join tablec c on b.id2 = c.id2
left join tabled d on c.id3 = c.id3
where d.type in (1,2,3,4)

(ce n'est même pas une grande déclaration)

éventuellement, vous pourriez faire la concaténation de chaîne, mais ce n'est pas souhaitable, à la lumière de l'ORM d'utilisation, et le SQL dynamique de concaténation de chaîne toujours commence avec de bonnes intentions (au moins dans ces régions).

  • Ils devraient être équivalentes. Jetez un oeil au plan d'exécution pour être sûr.
  • Je pense qu'il y a de plus approprié, le style de choses à se concentrer sur que cela, comme les alias de table, de ne pas utiliser SELECT *, etc. Le plan de requête est la seule chose qui va vous dire ce que l'optimiseur voit, et il peut changer en fonction des index et des statistiques.
  • Je l'ai testé sur 6 millions de lignes de la table. Et nombre de lignes affectées sont de 150 mille lignes. La réponse sont tous les mêmes.
  • Trois commentaires: (1) pourquoi auriez-vous besoin de concaténation de chaîne à ce sujet, (2) une liste ne va pas vous aider à éviter de concaténation si elle est fournie en paramètre, et (3) vous savez que l'utilisation de l'égalité À l'encontre de tout d de la colonne dans la clause where permet de transformer votre jointure externe gauche dans une jointure interne droite?
  • c'est un exemple simple. Je suis sûr que vous avez vu une partie de l'énorme SQL qui sont parfois nécessaires.
  • Je suis encore à essayer de comprendre comment vous allez pour changer un gros bloc de = à un gros bloc de IN où il va vraiment réduire votre code ou faire des choses moins enclins à exiger de concaténation/dyn SQL. Au lieu de montrer un exemple simple qui ne fait pas de sens, pourquoi ne pas montrer quelque chose de beaucoup plus proche de ce que vous faites? Si vous devez faire la concaténation de chaîne à écrire votre = listes, vous allez avoir à faire la concaténation de chaîne (ou de fractionnement à l'aide d'une table UDF) pour votre IN listes de trop. Peut-être il est une meilleure solution pour les deux, mais on ne peut pas les repérer inutile exemples.

InformationsquelleAutor sgtz | 2012-02-28