Lors d'une sélection SQL, la base de données va toujours se référer aux métadonnées de la table, qu'il s'agisse de SELECT * pour SELECT a, b, c ... Pourquoi? Parce que c'est là que se trouvent les informations sur la structure et la disposition de la table sur le système.
Il doit lire ces informations pour deux raisons. Un, pour simplement compiler la déclaration. Il doit s'assurer que vous spécifiez au moins une table existante. En outre, la structure de la base de données peut avoir changé depuis la dernière exécution d'une instruction.
Maintenant, évidemment, les métadonnées DB sont mises en cache dans le système, mais c'est encore un traitement qui doit être effectué.
Ensuite, les métadonnées sont utilisées pour générer le plan de requête. Cela se produit également à chaque fois qu'une instruction est compilée. Encore une fois, cela fonctionne avec les métadonnées mises en cache, mais c'est toujours fait.
Le seul moment où ce traitement n'est pas effectué est lorsque la base de données utilise une requête précompilée ou a mis en cache une requête précédente. C'est l'argument pour utiliser des paramètres de liaison plutôt que du SQL littéral. "SELECT * FROM TABLE WHERE key = 1" est une requête différente de "SELECT * FROM TABLE WHERE key =?" et le "1" est lié à l'appel.
Les bases de données reposent fortement sur la mise en cache des pages pour leur travail. De nombreuses bases de données modernes sont suffisamment petites pour tenir complètement en mémoire (ou, peut-être devrais-je dire, la mémoire moderne est suffisamment grande pour contenir de nombreuses bases de données). Ensuite, votre principal coût d'E / S sur le back-end est la journalisation et les vidages de page.
Cependant, si vous utilisez toujours le disque de votre base de données, une optimisation principale effectuée par de nombreux systèmes consiste à s'appuyer sur les données des index, plutôt que sur les tables elles-mêmes.
Si tu as:
CREATE TABLE customer (
id INTEGER NOT NULL PRIMARY KEY,
name VARCHAR(150) NOT NULL,
city VARCHAR(30),
state VARCHAR(30),
zip VARCHAR(10));
CREATE INDEX k1_customer ON customer(id, name);
Ensuite, si vous faites "SELECT id, nom FROM customer WHERE id = 1", il est très probable que votre DB extraira ces données de l'index, plutôt que des tables.
Pourquoi? Il utilisera probablement l'index de toute façon pour satisfaire la requête (par rapport à une analyse de table), et même si 'nom' n'est pas utilisé dans la clause where, cet index sera toujours la meilleure option pour la requête.
Maintenant, la base de données a toutes les données dont elle a besoin pour satisfaire la requête, il n'y a donc aucune raison de consulter les pages de la table elles-mêmes. L'utilisation de l'index entraîne moins de trafic disque car vous avez une densité de lignes plus élevée dans l'index que dans la table en général.
Ceci est une explication ondulée à la main d'une technique d'optimisation spécifique utilisée par certaines bases de données. Beaucoup ont plusieurs techniques d'optimisation et de réglage.
Au final, SELECT * est utile pour les requêtes dynamiques que vous devez taper à la main, je ne l'utiliserais jamais pour du "vrai code". L'identification de colonnes individuelles donne à la base de données plus d'informations qu'elle peut utiliser pour optimiser la requête, et vous donne un meilleur contrôle de votre code contre les changements de schéma, etc.
SELECT
requêtes sont exécutées / traitées diffère d'une base de données à l'autre.