Question

J'ai googlé cette question et ne peut pas sembler trouver une opinion cohérente, ou d'opinions qui sont fondées sur des données solides. Je voudrais simplement savoir si vous utilisez le caractère générique dans une instruction SQL SELECT surcharge supplémentaire que supporte appeler chaque élément individuellement. Je l'ai comparé les plans d'exécution des deux dans plusieurs requêtes de test différentes, et il semble que les estimations lisent toujours le même. Est-il possible que certains frais généraux sont engagés ailleurs, ou sont-ils vraiment géré de manière identique?

Ce que je fais référence spécifiquement:

SELECT *

vs.

SELECT item1, item2, etc.
Était-ce utile?

La solution

SELECT * FROM...

et

SELECT every, column, list, ... FROM...

fait la même chose parce que les deux sont une analyse non optimisé

La différence est:

  • la recherche supplémentaire dans sys.columns pour résoudre *
  • le contrat / changement de signature lorsque le schéma de table change
  • incapacité à créer un index de couverture. En fait, aucune option de réglage du tout, vraiment
  • doivent actualiser les vues nécessaires si non schemabound
  • ne peut pas indexer ou schemabind une vue en utilisant *
  • ... et d'autres choses

D'autres questions SO sur le même sujet ...

Autres conseils

Voulez-vous dire select * from ... au lieu de select col1, col2, col3 from ...?

Je pense qu'il est toujours préférable de nommer la colonne et récupérer la quantité minimale d'informations, parce que

  • votre code fonctionnera indépendamment de l'ordre physique des colonnes dans la db. L'ordre de la colonne ne devrait pas affecter votre application, mais ce sera le cas si vous utilisez *. Il peut être dangereux en cas de migration db, etc.
  • si vous nommez les colonnes, le SGBD peut optimiser l'exécution. Par exemple, s'il y a un indice qui contient toutes les données de votre intéresse, la table ne sera pas accessible à tous.

Si vous voulez dire quelque chose d'autre avec « joker », simplement ignorer ma réponse ...

EDIT: Si vous parlez de l'astérisque wild card comme dans Select * From ... puis voir d'autres réponses ...

Si vous parlez des caractères génériques dans les clauses sous-jacentes, ou d'autres expressions de requête en utilisant comme opérateur, (_ , % ) comme décrit ci-dessous, puis:

Cela a à voir avec l'aide si la Wildcard affecte si le SQL est « SARG-able » ou non. Sargable, (Recherche-ARGument-mesure) signifie ou non la recherche de la requête ou trier arguments peuvent être utilisés comme paramètres d'entrée à un index existant. Si vous préfixer la carte sauvage au début d'un argument

 Where Name Like '%ing'

Alors il n'y a pas moyen de traverser un index sur le champ de nom pour trouver les nœuds end 'ing'.

Si Otoh vous ajoutez le caractère générique à la fin,

Where Name like 'Donald%' 

l'optimiseur peut encore utiliser un index sur la colonne de nom, et la requête est toujours SARG-mesure

Si vous appelez voiture sauvage SQL est *. Cela ne signifie pas les frais généraux de performance en elle-même. Toutefois, si la table est vous étendue pourriez vous retrouver champs ne récupération recherche pas. D'une manière générale de ne pas être spécifique dans les champs recherche ou insert est une mauvaise habitude. Considérez

insert into mytable values(1,2)

Qu'arrive t-il si la table est étendue à trois champs?

Il ne peut pas être plus de travail d'un point de vue de plan d'exécution. Mais si vous récupérez les colonnes que vous n'avez pas fait, c'est la bande passante réseau supplémentaire utilisé entre la base de données et votre application. Aussi, si vous utilisez une API client de haut niveau qui effectue un travail sur les données renvoyées (par exemple, la selectall_hashref de Perl), ces colonnes supplémentaires imposera des coûts de performance du côté client. Combien? Cela dépend.

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