wildcard sql: les frais généraux de performance?
-
18-09-2019 - |
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.
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 ...
- Quelle est la raison de ne pas utiliser select *?
- Y at-il une différence betweeen Select * et la liste Sélectionnez chaque colonne
- Question de requêtes SQL - Sélectionner * de la vue ou Sélectionnez col1, col2 ... de la vue
- « select * from table » vs « select colA, colB, etc de la table » comportement intéressant dans SQLServer2005
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.