vista - select view sql server
Consulta SQL: seleccione*de la vista o Seleccione col1, col2,... colN de la vista (10)
Estamos usando SQL Server 2005, pero esta pregunta puede ser para cualquier RDBMS .
¿Cuál de los siguientes es más eficiente al seleccionar todas las columnas de una vista?
Select * from view
o
Select col1, col2, ..., colN from view
Lo mejor es seleccionar cada columna por 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.
NUNCA, NUNCA USE "SELECT *" !!!!
¡Esta es la regla cardinal del diseño de consultas!
Hay multiples 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 crece, 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 COMER TODO LO QUE TOMA.
Para el rendimiento: mire el plan de consulta (no debe haber diferencia).
Para la mantenibilidad - siempre suministre una lista de campo (que también se usa para INSERT INTO).
Si realmente está seleccionando todas las columnas, no debería haber ninguna diferencia notable si solicita * o si es explícito. El servidor SQL analizará la solicitud de la misma manera en prácticamente la misma cantidad de tiempo.
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.
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 "SELECCIONAR * ...", ya que entonces no tengo que preocuparme si cambio la estructura de la tabla subyacente. Además, para alguien que mantiene el código, al ver "SELECCIONAR *", se le informa que esta consulta está destinada a devolver todas las columnas, mientras que si se enumeran las columnas individualmente no se transmite la misma intención.
Solo para aclarar un punto que varias personas ya han expresado, el motivo por el cual 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 se realiza la consulta usando columnas explícitas
Siéntase libre de usar Select * 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.
select
column1
,column2
,column3
.
.
.
from Your-View
este es más optimizador que Usar el
select *
from Your View
Depende. La herencia de vistas puede ser algo ú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;
Seleccione * 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 y no eficiencia en la codificación.