Question

Dans Oracle, lors de la recherche de l'existence d'une ligne, pourquoi Select 1 est-il plus rapide que Select count (*)?

Était-ce utile?

La solution

Etant donné qu'Oracle ne prend pas en charge IF EXISTS dans PL / SQL, la suggestion de CodeByMidnight d'utiliser EXISTS se ferait normalement avec un élément tel que

.
SELECT 1 
  INTO l_local_variable 
  FROM dual 
 WHERE EXISTS( 
    SELECT 1 
      FROM some_table 
     WHERE some_column = some_condition ); 

Oracle sait qu'il peut cesser de traiter la clause WHERE EXISTS dès qu'une ligne est trouvée. Il n'a donc pas besoin de compter un grand nombre de lignes correspondant aux critères. Bien sûr, cela pose moins de problèmes si vous vérifiez s'il existe une ligne avec une clé particulière que si vous vérifiez une condition impliquant des colonnes non indexées ou si vous vérifiez une condition pouvant entraîner le renvoi d'un grand nombre de lignes.

(Remarque: j'aimerais pouvoir publier ceci sous forme de commentaire sur le message de CodeByMidnight, mais les commentaires ne peuvent inclure de code formaté.)

UPDATE: Compte tenu des précisions apportées par l'affiche originale dans son commentaire, la réponse brève et définitive est qu'un SELECT 1 ou un SELECT COUNT (1) n'est pas plus rapide que un SELECT COUNT (*) . Contrairement aux instructions de codage que vous consultez, COUNT (*) est la méthode recommandée pour compter toutes les lignes. Il existait un vieux mythe selon lequel un COUNT (1) était plus rapide. À tout le moins, cela n’a été le cas dans aucune version d’Oracle publiée au cours de la dernière décennie et il est peu probable que ce soit le cas. C'était une croyance largement répandue, cependant. Aujourd'hui, le code qui fait un COUNT (1) plutôt qu'un COUNT (*) me laisse généralement penser que l'auteur est enclin à croire divers mythes d'Oracle. suggère d'utiliser COUNT (*) .

Autres conseils

Il est préférable d'utiliser EXISTS là où le SGBDR le prend en charge ou un équivalent, car cela interrompt le traitement des lignes dès qu'il trouve une correspondance.

Je serais surpris que select count (*) ne soit pas correctement optimisé, il n'est pas nécessaire de charger toutes les colonnes car il n'y aura pas de traitement associé aux colonnes.

Parce qu’une étoile prend en compte tous les cols, "1" est un type de données natif.

Dans MySQL "SELECT COUNT (name_of_the_primary_key)" devrait être aussi rapide que votre SELECT 1. C'est l'indice qui compte. Un compte () sur un index devrait être assez rapide;)

Je ne pense pas que cela soit vrai pour Oracle. http://justoracle.blogspot.com/2006/12/count- vs-count1.html

Mais, dans certaines bases de données, la raison en est que '*' doit visiter les méta-données des tables. Cela tend à ajouter une surcharge inutile. Où 1 est juste un littéral.

Toutes choses étant égales par ailleurs, " select 1 de ma_table " renverra le résultat premier plus rapidement que " select count (*) de my_table ". , mais si vous récupérez tous les résultats de la requête, le nombre count (*) sera plus rapide car il implique beaucoup moins de données (1 entier, par opposition à 1 entier par ligne). dans le tableau).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top