Durante una selección de SQL, el DB siempre se referirá a los metadatos de la tabla, independientemente de si es SELECCIONAR * para SELECCIONAR 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 una tabla existente como mínimo. 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 DB se almacenan en caché en el sistema, pero aún es el procesamiento lo que debe hacerse.
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. De nuevo, esto se ejecuta en contra de metadatos en caché, pero siempre está hecho.
La única vez que no se realiza este proceso es cuando el DB está utilizando una consulta precompilada, o ha guardado en caché una consulta previa. 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 de "SELECT * FROM TABLE WHERE key =?" y el "1" está vinculado a la llamada.
Las bases de datos se basan en gran medida en el almacenamiento en caché de la página 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 en muchos DB). Entonces su costo primario de E/S en el back-end es el inicio de sesión y las descargas de página.
Sin embargo, si todavía está golpeando el disco para su base de datos, una optimización principal realizada por muchos sistemas es confiar en los datos en í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 "SELECT ID, el nombre del Cliente donde id = 1", es muy probable que DB se tire estos datos del índice, más que de las mesas.
¿Por qué? Es probable que use el índice de todos modos para satisfacer la consulta (frente a una exploración de tabla), y aunque "nombre" no se use 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 golpear las páginas de la tabla. Al utilizar el índice, se obtiene un menor tráfico de disco, ya que tiene una mayor densidad de filas en el índice que en la tabla en general.
Esta es una explicación ondulada a mano 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, SELECCIONAR * es útil para las consultas dinámicas que debe 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 da un mejor control en su código contra cambios de esquema, etc.
¿Hay un RDBMS específico que usted está preguntando acerca de? Es posible que la forma en que se ejecutan o procesen las consultas 'SELECT' sea diferente de la base de datos a la base de datos. –
Como nota aparte, en PostgreSQL, si dices 'CREATE VIEW foo_view AS SELECT * FROM foo;', luego agregas columnas a la tabla foo más adelante, esas columnas no se mostrarán automáticamente en foo_view como se esperaba. En otras palabras, el '*' en este contexto solo se expande una vez (en el tiempo de creación de la vista), no por SELECCIONAR. Debido a las complicaciones que surgen de ALTER TABLE, diría que (en la práctica) '*' se considera dañino. –
@JoeyAdams: no solo PostgresQL, este es también el comportamiento de Oracle. – APC