2008-09-24 7 views

Respuesta

35

NUNCA, NUNCA USE "SELECT *" !!!!

¡Esta es la regla cardinal del diseño de consultas!

Existen varias razones para esto. Una de ellas es que si su tabla solo tiene tres campos y usa los tres campos en el código que llama a la consulta, hay una gran posibilidad de que agregue más campos a esa tabla a medida que la aplicación crezca, y si su consulta de selección * solo pretendía devolver esos 3 campos para el código de llamada, y luego está extrayendo muchos más datos de la base de datos de los que necesita.

Otra razón es el rendimiento. En el diseño de consultas, no piense en la reutilización tanto como este mantra:

TOME TODO LO QUE PUEDA COMER, PERO COMA TODO LO QUE TOMA.

+1

La única vez que debería estar tentado de usar "select *" está dentro de un exists(), ¡pero no es así! Use "seleccionar 1" en su lugar. –

+2

¡SELECCIONAR 1 es divertido! – devlord

+2

@Even Mien: Depende de la implementación. Algunos RDBMS saben cómo optimizar 'SELECT *' dentro de un predicado 'EXISTS()', por lo que incluso puede ser más eficiente que 'SELECT 1'. La única manera de saber por usre es probar con su marca y versión. –

0

Si realmente seleccionar todas las columnas, que no debe hacer ninguna diferencia notable si se solicita * o si no está explícito. El servidor SQL analizará la solicitud de la misma manera en prácticamente la misma cantidad de tiempo.

11

Es una buena práctica seleccionar cada columna por su nombre. En el futuro, su esquema DB podría cambiar para agregar columnas que no necesitaría para una consulta en particular. Yo recomendaría seleccionar cada columna por nombre.

0

Siempre seleccione col1, col2 etc. de la vista. No hay diferencia de eficiencia entre los dos métodos que conozco, pero usar "select *" puede ser peligroso. Si modifica la definición de su vista agregando nuevas columnas, puede romper un programa usando "select *", mientras que la selección de un conjunto predefinido de columnas (incluso todas ellas, nombradas), seguirá funcionando.

0

Supongo que todo depende de lo que haga el optimizador de consultas.

Si quiero obtener cada registro en la fila, generalmente usaré la opción "SELECT * ...", ya que entonces no tengo que preocuparme si debo cambiar la estructura de la tabla subyacente. Además, para alguien que mantiene el código, ver "SELECT *" les dice que esta consulta está destinada a devolver cada columna, mientras que la lista de las columnas de forma individual no transmite la misma intención.

2

Seleccionar * es una práctica de programación deficiente. Es tan probable que las cosas se rompan como lo es para evitar que las cosas se rompan. Si solo está consultando una tabla o vista, entonces la ganancia de eficiencia puede no estar allí (aunque es posible si no tiene la intención de usar realmente todos los campos). Si tiene una unión interna, entonces tiene al menos dos campos que devuelven los mismos datos (los campos de unión) y, por lo tanto, está desperdiciando recursos de red para enviar datos redundantes a la aplicación. No se dará cuenta de esto al principio, pero a medida que los conjuntos de resultados se vuelvan cada vez más grandes, pronto tendrá un canal de red completo y no tiene que serlo. No se me ocurre ninguna instancia en la que select * te gane nada. Si se agrega una nueva columna y no necesita ir al código para hacer algo con ella, la consulta no debe devolverla por definición.Si alguien descarta y recrea la tabla con las columnas en un orden diferente, todas las consultas mostrarán que la información se muestra incorrecta o dará malos resultados, como poner el precio en el campo de número de pieza en un nuevo registro.

Además, es rápido arrastrar los nombres de las columnas desde el navegador de objetos, por lo que es pura pereza, no eficiencia en la codificación.

0

Para el rendimiento: consulte el plan de consulta (no debería haber diferencia).

Para el mantenimiento. - siempre suministre una lista de campo (que también se usa para INSERT INTO).

3

Solo para aclarar un punto que varias personas ya han expresado, el motivo por el que Select * es ineficiente es porque tiene que haber una llamada inicial al DB para averiguar exactamente qué campos están disponibles, y luego una segunda llamada donde la consulta se realiza utilizando columnas explícitas.

Siéntase libre de usar Seleccione * cuando está depurando, ejecutando consultas informales o en las primeras etapas de desarrollo de una consulta, pero tan pronto como conozca las columnas requeridas, indíquelas explícitamente.

0

Depende. La herencia de puntos de vista puede ser una cosa muy útil y fácil de mantener (SQL Anywhere):

create view v_fruit as select F.id, S.strain from F key join S; 
create view v_apples as select v_fruit.*, C.colour from v_fruit key join C; 
0
select 
column1 
,column2 
,column3 
. 
. 
. 
from Your-View 

éste es más optimizador de utilizar el

select * 
from Your View 
Cuestiones relacionadas