en oracle, lors de l'interrogation de l'existence de la ligne, pourquoi SELECT 1 FAST que SELECT Count (*)? P>
8 Réponses :
Parce qu'une star prend tous les cols dans le comte, "1" est un type de données natif. P>
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;) p>
http://www.dbasupport.com/forums /archive/index.php/t-28741.html P>
pour Oracle au moins. P>
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. P>
Oui. Oracle Treats Count (*) exactement la même chose que le nombre (1), le compte (null), compte («toute valeur atomique que vous aimez»).
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. P>
+1 Nous ne devrions utiliser que compter () Nous devons connaître le nombre réel d'enregistrements impliqués.
Je ne pense pas que cela soit vrai pour Oracle. http://justoracle.blogspot.com/2006/12/count- vs-comte1.html p>
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. P>
É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 );
Toutes les autres choses étant égales, "SELECT 1 de My_Table" CODE> retournera le résultat
"Sélectionnez Compte (*) de My_Table" code>, mais si vous récupérez tous les résultats de la requête, le
comptent (*) code> 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). P>
Si vous utilisez PostgreSQL, Per: https://www.citusdata.com/ Blog / 2016/10/12 / Count-Performance / : P>
une note sur Count (1) CODE> est en infraction plus lente que le nombre
(*) p> p> P>
comptez (1) code> vs
compte (*) code>. On pourrait penser que
compter (1) code> serait plus rapide car
comptez (*) code> 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 * code>. PostgreSQL analyse l'expression
compte (*) code> comme cas particulier ne prenant aucun argument. (Historiquement, l'expression aurait dû être définie comme
comptez () code>.) D'autre part
Compte (1) Code> prend un argument et PostgreSQL doit vérifier à chaque rangée pour voir que son argument, 1, n'est toujours pas nul. P>
blockQuote>
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?