INSERT INTO vs SELECT INTO

¿Cuál es la diferencia entre usar

SELECT ... INTO MyTable FROM... 

y

 INSERT INTO MyTable (...) SELECT ... FROM .... 

?

Desde BOL [ INSERT , SELECT … INTO ], sé que al usar SELECT … INTO creará la tabla de inserción en el grupo de archivos predeterminado si aún no existe, y que el registro de esta statement depende de la recuperación modelo de la base de datos.

  1. ¿Qué enunciado es preferible?
  2. ¿Hay otras implicaciones de rendimiento?
  3. ¿Cuál es un buen caso de uso para SELECT … INTO over INSERT INTO …?

Editar: Ya dije que sé que SELECCIONAR EN … crea una tabla donde no existe. Lo que quiero saber es que SQL incluye esta statement por una razón, ¿qué es? ¿Está haciendo algo diferente entre bastidores para insertar filas, o se trata simplemente de azúcar sintáctico sobre un CREATE TABLE e INSERT INTO ?

  1. Ellos hacen cosas diferentes. Use INSERT cuando la tabla exista. Use SELECT INTO cuando no lo haga.

  2. Sí. INSERT sin sugerencias de tabla normalmente se registra. SELECT INTO se registra mínimamente suponiendo que se establecen los indicadores de seguimiento adecuados.

  3. Según mi experiencia, SELECT INTO se usa con más frecuencia con conjuntos de datos intermedios, como #temp tables, o para copiar una tabla completa como para una copia de seguridad. INSERT INTO se usa cuando se inserta en una tabla existente con una estructura conocida.

EDITAR

Para abordar su edición, hacen cosas diferentes. Si está creando una tabla y quiere definir la estructura, use CREATE TABLE e INSERT . Ejemplo de un problema que se puede crear: tiene una tabla pequeña con un campo varchar. La cadena más grande en su tabla ahora es de 12 bytes. Su conjunto de datos real necesitará hasta 200 bytes. Si selecciona SELECT INTO en su tabla pequeña para hacer una nueva, la INSERT posterior fallará con un error de truncamiento porque sus campos son demasiado pequeños.

  1. ¿Qué enunciado es preferible? Depende de lo que estás haciendo.

  2. ¿Hay otras implicaciones de rendimiento? Si la tabla es una tabla permananent, puede crear índices en el momento de la creación de la tabla, lo que tiene implicaciones negativas y positivas para el rendimiento. Seleccionar en no recrea los índices que existen en las tablas actuales y, por lo tanto, el uso posterior de la tabla puede ser más lento de lo que debe ser.

  3. ¿Cuál es un buen caso de uso para SELECT … INTO over INSERT INTO …? Seleccionar en se utiliza si no puede conocer la estructura de la mesa de antemano. Es más rápido escribir que crear una tabla y una inserción, por lo que se usa para acelerar el desarrollo a veces. A menudo es más rápido usarlo cuando está creando una tabla temporal rápida para probar cosas o una tabla de respaldo de una consulta específica (tal vez registros que va a eliminar). Debería ser raro ver que se utiliza en el código de producción que se ejecutará varias veces (a excepción de las tablas temporales) porque fallará si la tabla ya existiera.

A veces se usa inapropiadamente por personas que no saben lo que están haciendo. Y pueden causar esgulps en el DB como resultado. Creo firmemente que es inapropiado usar SELECT INTO para cualquier cosa que no sea una tabla desechable (una copia de seguridad temporal, una tabla temporal que desaparecerá al final del proceso almacenado, etc.). Las tablas permanentes necesitan una reflexión real sobre su diseño y SELECCIONAR INTO hace que sea fácil evitar pensar en algo, incluso tan básico como qué columnas y qué tipos de datos.

En general, prefiero el uso de la tabla de creación y la statement de inserción: tiene más control y es mejor para procesos repetibles. Además, si la tabla es una tabla permanente, debe crearse a partir de un script de creación de tabla separado (uno que esté en control de fuente) ya que la creación de objetos permanentes no debería, en general, estar en código que inserte / elimine / actualice o seleccione de una mesa. Los cambios de objeto se deben manejar por separado de los cambios de datos porque los objetos tienen implicaciones más allá de las necesidades de una inserción / actualización / selección / eliminación específica. Debe considerar los mejores tipos de datos, debe pensar en las restricciones y PK de PK y otras restricciones, debe considerar los requisitos de auditoría, debe pensar en la indexación, etc.

La principal diferencia es que SELECT INTO MyTable creará una nueva tabla llamada MyTable con los resultados, mientras que INSERT INTO requiere que MyTable ya exista.

Utilizará SELECT INTO solo en el caso en que la tabla no exista y desee crearla en función de los resultados de su consulta. Como tal, estas dos declaraciones realmente no son comparables. Ellos hacen cosas muy diferentes.

En general, SELECT INTO se usa con más frecuencia para tareas únicas, mientras que INSERT INTO se usa regularmente para agregar filas a tablas.

EDITAR:
Aunque puede usar CREATE TABLE e INSERT INTO para lograr lo que SELECT INTO hace, con SELECT INTO no necesita conocer la definición de la tabla de antemano. SELECT INTO probablemente esté incluido en SQL porque hace que tareas como informes ad hoc o copiar tablas sean mucho más fáciles.

Cada statement tiene un caso de uso distinto. No son intercambiables.

SELECT...INTO MyTable... crea una nueva MyTable donde antes no existía.

INSERT INTO MyTable...SELECT... se usa cuando MyTable ya existe.

En realidad SELECT … INTO no solo crea la tabla, sino que fallará si ya existe, por lo que básicamente la única vez que la usaría es cuando la tabla a la que está insertando no existe.

En lo que respecta a su EDIT:

Personalmente uso principalmente SELECT … INTO cuando estoy creando una tabla temporal. Eso para mí es el uso principal. Sin embargo, también lo uso cuando creo nuevas tablas con muchas columnas con estructuras similares a otras tablas y luego las edito para ahorrar tiempo.

SELECT INTO se usa generalmente para generar tablas temporales o para copiar otra tabla (datos y / o estructura).

En el código diario, utiliza INSERT porque sus tablas ya deberían existir para ser leídas, ACTUALIZADAS, ELIMINADAS, UNIDAS, etc. Nota: la palabra clave INTO es opcional con INSERTAR

Es decir, las aplicaciones normalmente no crean y eliminan tablas como parte de las operaciones normales, a menos que sea una tabla temporal para un uso limitado y específico del scope.

Una tabla creada por SELECT INTO no tendrá claves o índices o restricciones a diferencia de una tabla real, persistente, ya existente

Los 2 no son directamente comparables porque casi no tienen superposición en el uso

Seleccione crear tabla nueva para usted en ese momento y luego inserte registros en ella desde la tabla fuente. La tabla recién creada tiene la misma estructura que la tabla de origen. Si intenta utilizar select into para una tabla existente, producirá un error, ya que intentará crear una nueva tabla con el mismo nombre. Insertar requiere que la tabla exista en su base de datos antes de insertar filas en ella.

Solo quiero cubrir el segundo punto de la pregunta relacionado con el rendimiento, porque ningún otro ha cubierto esto. Seleccionar en es mucho más rápido que insertar, cuando se trata de tablas con grandes conjuntos de datos. Prefiero seleccionar cuando tengo que leer una mesa muy grande. insertar en una tabla con 10 millones de filas puede tomar horas, mientras que select into lo hará en minutos, y en cuanto a la pérdida de índices en la nueva tabla, puede recrear los índices por consulta y aún puede ahorrar mucho más tiempo en comparación con insertar en.

La diferencia simple entre Select into y Insert Into es: -> Select Into no need table existente. Si desea copiar los datos de la tabla A, simplemente escriba Select * INTO [tablename] from A. Aquí, tablename puede ser una tabla existente o se creará una nueva tabla que tiene la misma estructura que la tabla A.

-> Insertar Into necesita una tabla existente. INSERT INTO [tablename] SELECT * FROM A ;. Aquí tablename es una tabla existente.

Seleccionar en general es más popular para copiar datos, especialmente datos de respaldo.

Puede usar de acuerdo con su requerimiento, es una elección del desarrollador que debe ser utilizada en su escenario.

Rendimiento sabio Insertar INTO es rápido.

Referencias

https://www.w3schools.com/sql/sql_insert_into_select.asp https://www.w3schools.com/sql/sql_select_into.asp

Seleccionar en conjuntos de datos grandes puede ser bueno solo para un solo usuario que usa una sola conexión a la base de datos que realiza una tarea de operación masiva. No recomiendo usar

 SELECT * INTO table 

ya que esto crea una gran transacción y crea un locking de esquema para crear el objeto, evitando que otros usuarios creen objetos o accedan a los objetos del sistema hasta que se complete la operación SELECT INTO .

Como prueba de concepto, abra 2 sesiones, en la primera sesión intente usar

 select into temp table from a huge table 

y en la segunda sección intenta

 create a temp table 

y compruebe los lockings, el locking y la duración de la segunda sesión para crear un objeto de tabla temporal. Mi recomendación es siempre una buena práctica para crear e insertar instrucción y, si es necesario para un registro mínimo, use trace flag 610.