Maison >base de données >tutoriel mysql >SELECT 1 contre SELECT * dans les sous-requêtes EXISTS : est-ce important pour les performances ?

SELECT 1 contre SELECT * dans les sous-requêtes EXISTS : est-ce important pour les performances ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-15 20:14:42890parcourir

SELECT 1 vs. SELECT * in EXISTS Subqueries: Does it Matter for Performance?

*Optimisation de la sous-requête EXISTS : différence de performances entre SELECT 1 et SELECT **

Lors de l'utilisation de l'opérateur EXISTS dans une requête SQL, il existe un différend quant à savoir s'il faut spécifier SELECT 1 ou SELECT * dans la sous-requête. Cet article explore l’impact sur les performances des deux approches.

**Méthode traditionnelle : SELECT ***

Traditionnellement, les sous-requêtes utilisent SELECT * car elles récupèrent toutes les colonnes de la sous-requête.

<code class="language-sql">IF EXISTS (SELECT * FROM TABLE WHERE Columns=@Filters)
BEGIN
   UPDATE TABLE SET ColumnsX=ValuesX WHERE Columns=@Filters
END</code>

Méthode alternative : SELECT 1

Les experts en bases de données recommandent que pour les vérifications EXISTS, l'utilisation de SELECT 1 soit plus efficace car elle ne renvoie qu'une seule valeur.

<code class="language-sql">IF EXISTS (SELECT 1 FROM TABLE WHERE Columns=@Filters)
BEGIN
   UPDATE TABLE SET ColumnsX=ValuesX WHERE Columns=@Filters
END</code>

Différence de performances

Malgré les prétendus avantages potentiels en termes de performances de SELECT 1, Microsoft SQL Server est conçu pour optimiser les sous-requêtes de l'opérateur EXISTS. Que vous utilisiez SELECT 1 ou SELECT *, SQL Server ne renvoie pas de données au système.

Vérification

Pour vérifier cette optimisation, essayez d'exécuter la requête suivante :

<code class="language-sql">SELECT whatever
  FROM yourtable
 WHERE EXISTS( SELECT 1/0
                 FROM someothertable 
                WHERE a_valid_clause )</code>

Aucune erreur ne sera générée même si la sous-requête effectue une division invalide. Cela indique que la liste EXISTS dans la sous-requête SELECT ne sera pas évaluée.

Standard SQL

La norme ANSI SQL 1992 indique clairement que lorsqu'une liste SELECT contient uniquement "*" dans la sous-requête EXISTS, elle équivaut à un littéral arbitraire.

Conclusion

Sur la base des capacités d'optimisation de SQL Server et des normes SQL, il n'y a aucune différence de performances lors de l'utilisation de SELECT 1 ou SELECT * dans une sous-requête EXISTS. Les deux méthodes renverront les mêmes résultats avec la même efficacité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn