Durante una selección de SQL, la base de datos siempre se referirá a los metadatos de la tabla, independientemente de si es SELECT * para SELECT a, b, c ... ¿Por qué? Porque ahí es donde está la información sobre la estructura y el diseño de la tabla en el sistema.
Tiene que leer esta información por dos razones. Uno, simplemente compilar la declaración. Debe asegurarse de especificar al menos una tabla existente. Además, la estructura de la base de datos puede haber cambiado desde la última vez que se ejecutó una declaración.
Ahora, obviamente, los metadatos de la base de datos se almacenan en caché en el sistema, pero aún es necesario procesarlo.
A continuación, los metadatos se utilizan para generar el plan de consulta. Esto sucede cada vez que se compila una declaración también. Nuevamente, esto se ejecuta contra metadatos almacenados en caché, pero siempre se hace.
El único momento en que este procesamiento no se realiza es cuando la base de datos está utilizando una consulta precompilada o ha almacenado en caché una consulta anterior. Este es el argumento para usar parámetros de enlace en lugar de SQL literal. "SELECT * FROM TABLE WHERE key = 1" es una consulta diferente a "SELECT * FROM TABLE WHERE key =?" y el "1" está vinculado a la llamada.
Las bases de datos dependen en gran medida del almacenamiento en caché de páginas para su trabajo. Muchos DB modernos son lo suficientemente pequeños como para caber completamente en la memoria (o, tal vez debería decir, la memoria moderna es lo suficientemente grande como para caber muchos DB). Luego, su costo de E / S principal en el back-end es el inicio de sesión y el vaciado de páginas.
Sin embargo, si todavía está presionando el disco para su base de datos, una optimización principal realizada por muchos sistemas es confiar en los datos en los índices, en lugar de las tablas en sí.
Si usted tiene:
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);
Entonces, si hace "SELECT id, name FROM customer WHERE id = 1", es muy probable que DB extraiga estos datos del índice, en lugar de las tablas.
¿Por qué? Es probable que use el índice de todos modos para satisfacer la consulta (frente a un escaneo de tabla), y aunque 'nombre' no se usa en la cláusula where, ese índice seguirá siendo la mejor opción para la consulta.
Ahora la base de datos tiene todos los datos que necesita para satisfacer la consulta, por lo que no hay razón para ir a las páginas de la tabla. El uso del índice da como resultado menos tráfico de disco ya que tiene una mayor densidad de filas en el índice en comparación con la tabla en general.
Esta es una explicación manual de una técnica de optimización específica utilizada por algunas bases de datos. Muchos tienen varias técnicas de optimización y ajuste.
Al final, SELECT * es útil para consultas dinámicas que tiene que escribir a mano, nunca lo usaría para "código real". La identificación de columnas individuales le da al DB más información que puede usar para optimizar la consulta, y le brinda un mejor control en su código contra cambios de esquema, etc.
SELECTse ejecutan / procesen las consultas sea diferente de una base de datos a otra.