7
votes

Utilise-t-on compte (*) ou sélectionnez une bonne idée?

J'ai entendu plusieurs fois que vous ne devriez pas exécuter compter (*) ou SELECT * pour des raisons de performances, mais n'a pas pu récupérer d'autres informations à ce sujet.

Je peux imaginer que la base de données utilise alors toutes les colonnes pour l'action, qui peut être une perte de performance impressionnante, mais je ne suis pas sûr de cela. Est-ce que quelqu'un a des informations supplémentaires sur le sujet?


4 commentaires

Certains moteurs de base de données optimiseront un comptent (*) à l'aide d'un index car les valeurs réelles dans les colonnes sont ignorées.


Article intéressant


Une chose que je n'utiliserais jamais est SELECT * dans une procédure stockée . Plusieurs fois, j'ai dû déterminer pourquoi mon code est cassé et c'est parce que la base de données renvoie maintenant une nouvelle colonne.


@Gabe: presque juste: ... en utilisant le PK parce que ... cela fait une différence!


8 Réponses :


0
votes

Il est absolument vrai que "*" est "toutes les colonnes". Et vous avez raison de savoir si vous avez une table avec un nombre incroyable de colonnes (disons 100+), ces types de requêtes peuvent être mauvaises en termes d'efficacité.

Je pense que la meilleure solution consiste à créer des vues de base de données précédemment filtrant le montant des enregistrements évolué dans l'opération de comptage. L'impact des performances n'est pas un gros problème, car les vues peuvent être mises en cache.

D'autre part, il semble que "*" l'opérateur soit évité lors du retour des enregistrements, et il est brutalement préférable de sélectionner les champs que vous devez vraiment utiliser dans certaines entreprises.


0 commentaires

0
votes

Lorsque vous utilisez SELECT * Il peut avoir une performance touchée. Applications qui utilisent la syntaxe SELECT * lorsqu'elles n'ont réellement besoin que d'une poignée de colonnes transférant plus de données sur le réseau qu'au besoin de consommer, ce qui est gaspillé.

Aussi, dans Microsoft SQL Server au moins, il y a un problème étrange lorsque vous utilisez Sélectionnez * dans une vue, puis ajoutez une colonne à la table sous-jacente. Les en-têtes de colonne et les données renvoyées à la vue ne correspondent pas à certains changements suivants! Voir Mon article de blog pour plus d'informations Détails de ce problème particulier.


0 commentaires

0
votes

En cas de Count (*) IT dépend sur la base de données et sa version. Par exemple dans les versions modernes de MS SQL Peu importe [la source nécessaire].

Donc, la meilleure approche en cas de Count (*) est de le mesurer.

Utilisation Select * est vraiment mauvaise idée. * signifie lire toutes les colonnes pouvant être une opération Heavy Io et réseau (en particulier pour divers types de colonnes de caractères ). De plus - plutôt rarement, vous avez besoin de toutes les colonnes.


1 commentaires

CONSEIL: Si vous Soulignerez Presque Chaque Word IT perd C'est Signification .



6
votes

Count (*) est différent du nombre (colonne1) !
Count (*) renvoie le nombre d'enregistrements et n'utilise pas plus de ressources, tandis que Count (colonne1) compte le nombre d'enregistrements où la colonne1 est non null.

pour Sélectionnez , il est différent. Sélectionnez * Demandera bien sûr plus de données.


0 commentaires

0
votes

Selon la taille de la base de données dépend de la manière dont il devient inefficace, le moyen de décrire simnplest serait comme si:

Lorsque vous faites spécifiquement: P>

SELECT * FROM table1


0 commentaires

3
votes

Lorsque vous utilisez comptez (*) le * ne signifie pas "tous les champs". Utilisation de Count (champ) comptera toutes les valeurs non nulles dans le champ, mais Count (*) comptera toujours tous les enregistrements même si tous les champs de tous les enregistrements sont nuls, Donc, il n'a pas besoin de vérifier les données dans les champs du tout.

Utilisation de SELECT * signifie que vous retournez presque toujours plus de données que vous allez utiliser, ce qui est bien sûr un gaspillage. Cependant, peut-être plus grave est le problème de la maintenance; Si vous ajoutez des champs à un tableau, votre requête les retournera aussi. Cela pourrait signifier que l'enregistrement devient trop volumineux pour s'adapter à la mémoire tampon, ce qui entraîne un message d'erreur.


0 commentaires

1
votes

Ne confondez pas le * dans "Compter (*)" avec le * dans "Select *". Ils sont complètement indépendants mais parfois confondus parce que c'est une syntaxe si étrange. Il n'y a rien de mal à utiliser le nombre (*), ce qui signifie simplement "rangées de comptage".

Sélectionnez * D'autre part signifie "Sélectionner toutes les colonnes". C'est généralement une pratique médiocre car elle coule étroitement votre code au schéma de la base de données. Cela signifie que lorsque vous changez de table, vous devez probablement changer le code même s'il aurait dû être non affecté. Il augmente l'impact de tout changement de schéma.

Select * peut également provoquer un plan de requête sous-optimale. Soit parce que vous n'avez pas vraiment besoin de toutes les colonnes ou que cela oblige le SGBD à effectuer une recherche supplémentaire au moment de l'exécution pour obtenir la liste des colonnes.


0 commentaires

15
votes

1. Le nombre (*) par rapport à nombre de (quelque chose d'autre)

SQL est déclarative que vous spécifiez ce em> vous voulez. Ceci est différent de spécifier comment em> pour obtenir ce que vous voulez. Cela signifie que le moteur de base de données est libre de réaliser votre demande de quelque manière qu'il pense est le plus efficace. De nombreuses bases de données optimiseurs réécrit votre requête à une alternative moins coûteuse (si un tel plan est disponible) p>

Étant donné le tableau suivant:. P>

insert into t1 select * from t2;


1 commentaires

Le Insert dans T1 Select * à partir de T2 se ressemble réellement à mon œil comme une bonne utilisation pour SELECT * IFF Les deux tables sont nécessaires pour d'autres raisons d'être formatées de manière identique. Vos «conditions de rupture» devraient dire «T1 obtient une colonne non nulle et T2 ne » et «T2 obtient une autre colonne et T1 ne signifie pas . Il gérera correctement le Cas où la même colonne est ajoutée aux deux tableaux, tandis que le code qui a énuméré explicitement les colonnes à utiliser se casserait.