Durante uma seleção SQL, o banco de dados sempre se refere aos metadados da tabela, independentemente de ser SELECT * para SELECT a, b, c ... Por que? Porque é aí que estão as informações sobre a estrutura e o layout da tabela no sistema.
Ele precisa ler essas informações por dois motivos. Um, simplesmente compilar a declaração. Ele precisa garantir que você especifique uma tabela existente, no mínimo. Além disso, a estrutura do banco de dados pode ter sido alterada desde a última vez que uma instrução foi executada.
Agora, obviamente, os metadados do banco de dados são armazenados em cache no sistema, mas ainda é o processamento que precisa ser feito.
Em seguida, os metadados são usados para gerar o plano de consulta. Isso acontece sempre que uma declaração é compilada também. Novamente, isso é executado nos metadados armazenados em cache, mas sempre é feito.
O único momento em que esse processamento não é concluído é quando o banco de dados está usando uma consulta pré-compilada ou armazenou em cache uma consulta anterior. Este é o argumento para usar parâmetros de ligação em vez de SQL literal. "SELECT * FROM TABLE WHERE key = 1" é uma consulta diferente de "SELECT * FROM TABLE WHERE key =?" e o "1" é vinculado à chamada.
Os bancos de dados dependem muito do cache da página para que funcione. Muitos bancos de dados modernos são pequenos o suficiente para caber completamente na memória (ou, talvez eu deva dizer, a memória moderna é grande o suficiente para caber muitos bancos de dados). Então, o seu custo de E / S principal no back-end é o log e as descargas de página.
No entanto, se você ainda estiver pressionando o disco para o seu banco de dados, uma otimização primária feita por muitos sistemas é confiar nos dados nos índices, e não nas próprias tabelas.
Se você tem:
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);
Então, se você selecionar "SELECT id, nome FROM customer WHERE id = 1", é muito provável que o banco de dados extraia esses dados do índice, e não das tabelas.
Por quê? Provavelmente, ele usará o índice de qualquer maneira para satisfazer a consulta (versus uma verificação de tabela) e, embora 'name' não seja usado na cláusula where, esse índice ainda será a melhor opção para a consulta.
Agora, o banco de dados tem todos os dados necessários para satisfazer a consulta, portanto, não há motivo para acessar as páginas da tabela. O uso do índice resulta em menos tráfego de disco, pois você tem uma densidade mais alta de linhas no índice versus a tabela em geral.
Esta é uma explicação manual de uma técnica de otimização específica usada por alguns bancos de dados. Muitos têm várias técnicas de otimização e ajuste.
No final, SELECT * é útil para consultas dinâmicas que você precisa digitar manualmente, eu nunca o usaria para "código real". A identificação de colunas individuais fornece ao banco de dados mais informações que ele pode usar para otimizar a consulta e oferece um controle melhor no seu código contra alterações de esquema etc.
SELECT
consultas sejam executadas / processadas seja diferente de banco de dados para banco de dados.