11
votes

Pourquoi Sélectionnez-vous 1 SELECT 1 plus rapide que SELECT Count (*)?

en oracle, lors de l'interrogation de l'existence de la ligne, pourquoi SELECT 1 FAST que SELECT Count (*)?


5 commentaires

Sans savoir quel moteur RDBMS que vous utilisez, il n'y a aucun moyen de répondre correctement. Différents moteurs se comportent différemment


Voulez-vous dire "pourquoi SELECT comptez (1) plus rapidement que SELECT Count (*)"?


Je veux dire "SELECT 1". Je regarde de l'ancienne documentation de normes de codage hors ligne où elle est affirmée que "Select 1" est plus rapide que "Sélectionner le nombre (*)" et un moyen préféré d'interroger l'existence de la rangée. La documentation ne fournit pas d'explication technique pour la raison pour laquelle il s'agit d'une technique "améliorant la performance". Quand j'ai fouillé sur le net, j'ai trouvé des choses comme des threads et des débats asktom ... mais je n'ai pas vu de réponse claire et définitive.


J'ai mis à jour ma réponse. La réponse courte est qu'il n'y a pas de différence entre le nombre (*) et le nombre (1).


Quelle question pouvez-vous répondre le plus rapide. (a) Y a-t-il quelqu'un appelé "Smith" dans le répertoire? (b) Combien ce qu'on appelle Smith existe dans le répertoire téléphonique?


8 Réponses :


0
votes

Parce qu'une star prend tous les cols dans le comte, "1" est un type de données natif.

dans mysql "Sélectionnez le nombre (nom_of_the_primary_key)" doit être aussi rapide que votre sélection 1. C'est l'index qui compte. Un compte () sur un index devrait être assez rapide;)


0 commentaires

1
votes

2
votes

Je serais surpris si Select Count (*) n'a pas été correctement optimisé, il n'est pas nécessaire de charger dans toutes les colonnes car il n'y aura pas de traitement lié à colonne.


1 commentaires

Oui. Oracle Treats Count (*) exactement la même chose que le nombre (1), le compte (null), compte («toute valeur atomique que vous aimez»).



16
votes

Il est préférable de continuer à utiliser existe là où le RDBMS le prend en charge ou un équivalent, car cela arrête de traiter les lignes dès qu'il trouve une correspondance.


1 commentaires

+1 Nous ne devrions utiliser que compter () Nous devons connaître le nombre réel d'enregistrements impliqués.



0
votes

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

Mais, dans certaines bases de données, la raison est parce que "*" doit visiter les Tables méta-données. Cela a tendance à ajouter des frais généraux non nécessaires. Où comme 1 est juste un littéral.


0 commentaires

14
votes

Étant donné que Oracle ne prend pas en charge s'il existe dans PL / SQL, la suggestion de CodeBymidnightnight à utiliser existe normalement de quelque chose comme

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


0 commentaires

0
votes

Toutes les autres choses étant égales, "SELECT 1 de My_Table" retournera le résultat FIRST plus rapide que "Sélectionnez Compte (*) de My_Table" , mais si vous récupérez tous les résultats de la requête, le comptent (*) oncé sera plus rapide car il implique beaucoup moins de données (1 entier, par opposition à 1 entier par chaque rangée de la Table).


0 commentaires

0
votes

Si vous utilisez PostgreSQL, Count (1) est en infraction plus lente que le nombre (*)

Per: https://www.citusdata.com/ Blog / 2016/10/12 / Count-Performance / :

une note sur comptez (1) vs compte (*) . On pourrait penser que compter (1) serait plus rapide car comptez (*) apparaît pour consulter les données pour une rangée entière. Cependant, l'inverse est vrai. Le symbole étoile n'a pas de sens ici, contrairement à son utilisation dans SELECT * . PostgreSQL analyse l'expression compte (*) comme cas particulier ne prenant aucun argument. (Historiquement, l'expression aurait dû être définie comme comptez () .) D'autre part Compte (1) prend un argument et PostgreSQL doit vérifier à chaque rangée pour voir que son argument, 1, n'est toujours pas nul.


0 commentaires