Während einer SQL-Auswahl verweist die Datenbank immer auf die Metadaten für die Tabelle, unabhängig davon, ob es sich um SELECT * für SELECT a, b, c handelt ... Warum? Denn dort befinden sich die Informationen zur Struktur und zum Layout der Tabelle im System.
Diese Informationen müssen aus zwei Gründen gelesen werden. Erstens, um die Aussage einfach zusammenzustellen. Es muss sichergestellt sein, dass Sie mindestens eine vorhandene Tabelle angeben. Außerdem hat sich möglicherweise die Datenbankstruktur seit der letzten Ausführung einer Anweisung geändert.
Natürlich werden DB-Metadaten im System zwischengespeichert, aber es muss noch verarbeitet werden.
Als Nächstes werden die Metadaten zum Generieren des Abfrageplans verwendet. Dies geschieht jedes Mal, wenn eine Anweisung ebenfalls kompiliert wird. Dies läuft wiederum gegen zwischengespeicherte Metadaten, wird aber immer ausgeführt.
Diese Verarbeitung wird nur dann nicht durchgeführt, wenn die Datenbank eine vorkompilierte Abfrage verwendet oder eine vorherige Abfrage zwischengespeichert hat. Dies ist das Argument für die Verwendung von Bindungsparametern anstelle von wörtlichem SQL. "SELECT * FROM TABLE WHERE key = 1" ist eine andere Abfrage als "SELECT * FROM TABLE WHERE key =?" und die "1" ist an den Anruf gebunden.
DBs sind für ihre Arbeit stark auf das Zwischenspeichern von Seiten angewiesen. Viele moderne DBs sind klein genug, um vollständig in den Speicher zu passen (oder, vielleicht sollte ich sagen, der moderne Speicher ist groß genug, um in viele DBs zu passen). Dann sind Ihre primären E / A-Kosten im Back-End Protokollierung und Seitenlöschung.
Wenn Sie jedoch immer noch auf die Festplatte für Ihre Datenbank zugreifen, besteht eine Hauptoptimierung vieler Systeme darin, sich auf die Daten in Indizes und nicht auf die Tabellen selbst zu verlassen.
Wenn Sie haben:
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);
Wenn Sie dann "ID AUSWÄHLEN, Name VON Kunde WHERE ID = 1" ausführen, ist es sehr wahrscheinlich, dass Ihre Datenbank diese Daten aus dem Index und nicht aus den Tabellen abruft.
Warum? Der Index wird wahrscheinlich trotzdem verwendet, um die Abfrage zu erfüllen (im Vergleich zu einem Tabellenscan), und obwohl 'name' in der where-Klausel nicht verwendet wird, ist dieser Index immer noch die beste Option für die Abfrage.
Jetzt verfügt die Datenbank über alle Daten, die zur Erfüllung der Abfrage erforderlich sind. Es gibt also keinen Grund, die Tabellenseiten selbst aufzurufen. Die Verwendung des Index führt zu weniger Festplattenverkehr, da der Index eine höhere Zeilendichte aufweist als die Tabelle im Allgemeinen.
Dies ist eine handwellige Erklärung einer bestimmten Optimierungstechnik, die von einigen Datenbanken verwendet wird. Viele haben verschiedene Optimierungs- und Optimierungstechniken.
Am Ende ist SELECT * nützlich für dynamische Abfragen, die Sie manuell eingeben müssen. Ich würde es niemals für "echten Code" verwenden. Durch die Identifizierung einzelner Spalten erhält die Datenbank mehr Informationen, mit denen sie die Abfrage optimieren kann, und Sie können Ihren Code besser gegen Schemaänderungen usw. steuern.
SELECT
die Ausführung / Verarbeitung von Abfragen von Datenbank zu Datenbank unterschiedlich ist.