Lors d'un select SQL, la DB est toujours de consulter les métadonnées de la table, qu'il s'agisse d'SÉLECTIONNEZ * pour SÉLECTIONNER a, b, c... Pourquoi? Parce que c'est là que l'information sur la structure et l'agencement de la table sur le système.
Il y a qu'à lire cette information pour deux raisons. L'un, tout simplement de compiler la déclaration. Il doit assurez-vous de spécifier une table existante, à tout le moins. Aussi, la structure de base de données peuvent avoir changé depuis la dernière fois qu'une instruction a été exécutée.
Maintenant, évidemment, DB métadonnées sont mises en cache dans le système, mais il est toujours en cours de traitement qui doit être fait.
Ensuite, les métadonnées sont utilisées pour générer le plan de requête. Cela se produit chaque fois qu'une instruction est compilé en tant que bien. Encore une fois, cela va à l'encontre de mise en cache de métadonnées, mais c'est toujours fait.
Le seul moment où ce traitement n'est pas fait, c'est quand la bd est à l'aide d'un pré-compilés de la requête, ou a mis en cache une requête précédente. C'est l'argument pour l'utilisation de paramètres de liaison plutôt que de SQL littérale. "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.
DBs s'appuient fortement sur la page mise en cache pour y travailler. De nombreuses modernes DBs sont suffisamment petits pour tenir entièrement dans la mémoire (ou, devrais-je dire, de mémoire moderne est assez grand pour s'adapter à de nombreux DBs). Alors votre principal coût d'e/S sur le back-end est de la journalisation et de la page de bouffées de chaleur.
Toutefois, si vous êtes toujours frapper le disque pour votre DB, l'un primaire, l'optimisation effectuée par de nombreux systèmes est de s'appuyer sur les données dans les index, plutôt que de les tables elles-mêmes.
Si vous avez:
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 client where id = 1", il est très probable que vous DB va tirer de ces données à partir de l'index, plutôt que de les tables.
Pourquoi? Il faudra probablement utiliser l'index pour satisfaire à la requête (vs une analyse de la table), et même si le " nom " n'est pas utilisée dans la clause where, cet indice sera toujours la meilleure option pour la requête.
Maintenant, la base de données dispose de toutes les données dont il a besoin pour satisfaire à la requête, donc il n'y a pas de raison de frapper la table des pages elles-mêmes. En utilisant les résultats de l'indice en moins de trafic sur le disque puisque vous avez une plus grande densité de lignes dans l'index vs la table en général.
C'est une main ondulé explication spécifique d'une technique d'optimisation utilisée par certaines bases de données. Beaucoup ont plusieurs optimisation et performances techniques.
En fin de compte, SÉLECTIONNEZ * est utile pour les requêtes dynamiques, vous devez taper à la main, je n'avais jamais utiliser de "vrais code". L'Identification de chaque colonne donne la DB plus d'informations qu'il peut utiliser pour optimiser la requête, et vous donne un meilleur contrôle de votre code avec les modifications de schéma, etc.