Durante una selezione SQL, il DB farà sempre riferimento ai metadati per la tabella, indipendentemente dal fatto che sia SELECT * per SELECT a, b, c ... Perché? Perché è lì che si trovano le informazioni sulla struttura e il layout della tabella nel sistema.
Deve leggere queste informazioni per due motivi. Uno, per compilare semplicemente la dichiarazione. È necessario assicurarsi di specificare almeno una tabella esistente. Inoltre, la struttura del database potrebbe essere cambiata dall'ultima volta che è stata eseguita un'istruzione.
Ora, ovviamente, i metadati del DB sono memorizzati nella cache nel sistema, ma è ancora l'elaborazione che deve essere eseguita.
Successivamente, i metadati vengono utilizzati per generare il piano di query. Ciò accade anche ogni volta che viene compilata un'istruzione. Di nuovo, funziona con i metadati memorizzati nella cache, ma è sempre fatto.
L'unica volta che questa elaborazione non viene eseguita è quando il database utilizza una query precompilata o ha memorizzato nella cache una query precedente. Questo è l'argomento per l'utilizzo di parametri di associazione piuttosto che SQL letterale. "SELECT * FROM TABLE WHERE key = 1" è una query diversa da "SELECT * FROM TABLE WHERE key =?" e l '"1" è vincolato alla chiamata.
I DB fanno molto affidamento sulla memorizzazione nella cache delle pagine per il loro lavoro. Molti DB moderni sono abbastanza piccoli da adattarsi completamente alla memoria (o, forse dovrei dire, la memoria moderna è abbastanza grande da contenere molti DB). Quindi il tuo costo I / O primario sul back-end è la registrazione e lo svuotamento della pagina.
Tuttavia, se stai ancora premendo il disco per il tuo DB, un'ottimizzazione primaria eseguita da molti sistemi è fare affidamento sui dati negli indici, piuttosto che sulle tabelle stesse.
Se hai:
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);
Quindi se fai "SELECT id, name FROM customer WHERE id = 1", è molto probabile che il tuo DB estragga questi dati dall'indice, piuttosto che dalle tabelle.
Perché? Probabilmente utilizzerà comunque l'indice per soddisfare la query (rispetto a una scansione della tabella), e anche se "nome" non è utilizzato nella clausola where, quell'indice sarà comunque l'opzione migliore per la query.
Ora il database ha tutti i dati necessari per soddisfare la query, quindi non c'è motivo di raggiungere le pagine della tabella stesse. L'utilizzo dell'indice comporta una riduzione del traffico su disco poiché si ha una maggiore densità di righe nell'indice rispetto alla tabella in generale.
Questa è una spiegazione ondulata di una specifica tecnica di ottimizzazione utilizzata da alcuni database. Molti hanno diverse tecniche di ottimizzazione e messa a punto.
Alla fine, SELECT * è utile per le query dinamiche che devi digitare a mano, non lo userei mai per "codice reale". L'identificazione delle singole colonne fornisce al DB più informazioni che può utilizzare per ottimizzare la query e offre un controllo migliore nel codice contro le modifiche allo schema, ecc.
SELECT
query vengono eseguite / elaborate sia diverso da database a database.