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 deIN
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 votreIN
listes de trop. Peut-être il est une meilleure solution pour les deux, mais on ne peut pas les repérer inutile exemples.
Vous devez vous connecter pour publier un commentaire.
Les deux vont produire le même plan d'exécution - un
table scan
,index scan
, ouindex seek
, selon la façon dont vous avez à votre table indexée.Vous pouvez voir par vous-même - Affichage Graphique des Plans d'Exécution (SQL Server Management Studio) - Voir la section intitulée "Utiliser les Options du Plan d'Exécution".
Ces deux états sont équivalents à l'optimiseur (avez-vous de comparer les plans d'exécution?), mais je pense que le plus important avantage que vous obtenez de ces derniers
Peut être exprimé comme la suivante, beaucoup plus concis et lisible (mais sémantiquement équivalent à l'optimiseur) version:
Le problème est que lorsqu'elle est exprimée comme le dernier la plupart des gens pensent qu'ils peuvent passer une chaîne de caractères, comme
@list = '1,2,3,4,5'
et puis dire:Cela ne fonctionne pas parce que
@list
est une seule chaîne, et non pas un tableau d'entiers.Pour le cas où vous avez une unique valeur, je ne vois pas comment cette "optimisation" aide à quoi que ce soit. Vous n'avez pas écrit moins de SQL, vous avez écrit plus. Pouvez-vous décrire plus en détail la façon dont cela va conduire à moins de SQL?
WHERE id = 1
... comment est -WHERE id IN (1)
moins de SQL?