none
SELECT INTO, INSERT INTO (ordenado??) RRS feed

  • Pregunta

  • Buenas tardes,

    quizás la pregunta sea demasiado básica, pero ¿es posible insertar registros, ya sea en una nueva tabla con SELECT INTO o en una existente con INSERT INTO, de forma ORDENADA?

    Si no me equivoco, el ORDER BY de la selección a insertar, no es respetado en la tabla destino.

    Hay forma de hacer que la inserción sea ordenada?

    Muchas gracias.

    domingo, 14 de febrero de 2021 13:34

Todas las respuestas

  • No tiene sentido. Sí, puedes ejecutar las inserciones en forma ordenada. Pero da igual, porque en una base de datos relacional NO EXISTE ORDEN EN LAS TABLAS. Una tabla en SQL Server consiste en un almacenamiento DESORDENADO de registros. Aunque a veces pueda parecer que los devuelve en un cierto orden, este orden no está garantizado y el sistema es libre de devolverlos en cualquier orden, que no tiene por qué coincidir con el orden en que se insertaron. La única forma de garantizar que los registros se extraen de la tabla en un orden conocido es utilizar un ORDER BY a la hora de hacer el SELECT. No hay nada que se pueda hacer durante la inserción para garantizar que al leerlos saldrán en el mismo orden (aunque a veces por casualidad pueda parecer que inicialmente sí que se obtienen en el mismo orden al principio cuando se comienza a insertar registros).

    Dicho eso, hay casos en los que funcionará bien. Por ejemplo, si almacenas la tabla en un Heap (no en un clustered index) y los registros son de longitud fija, y nunca borras ninguno, en la práctica los leerás en el mismo orden. Y si la almacenas en un clustered index que agrupe sobre una clave autonumérica (identity), al leer toda la tabla seguirá el oden de la clave primaria y por lo tanto saldrán en el orden en el que se insertaron. Pero esto es "por casualidad", no se garantiza que sea así. Si en alguna versión futura se modifica el optimizador de consultas y (por ejemplo) aplica paralelismo en la recuperación de los datos, o si almacenas la tabla en un filegroup con más de un archivo, o algo similar, puede que de repente deje de respetar este orden y comiencen a salirte desordenados. Así que, en resumidas cuentas, si necesitas orden entonces lo único fiable es poner un ORDER BY al leer los datos.

    domingo, 14 de febrero de 2021 16:15
  • No tiene sentido. Sí, puedes ejecutar las inserciones en forma ordenada. Pero da igual, porque en una base de datos relacional NO EXISTE ORDEN EN LAS TABLAS. Una tabla en SQL Server consiste en un almacenamiento DESORDENADO de registros. Aunque a veces pueda parecer que los devuelve en un cierto orden, este orden no está garantizado y el sistema es libre de devolverlos en cualquier orden, que no tiene por qué coincidir con el orden en que se insertaron. La única forma de garantizar que los registros se extraen de la tabla en un orden conocido es utilizar un ORDER BY a la hora de hacer el SELECT. No hay nada que se pueda hacer durante la inserción para garantizar que al leerlos saldrán en el mismo orden (aunque a veces por casualidad pueda parecer que inicialmente sí que se obtienen en el mismo orden al principio cuando se comienza a insertar registros).

    Dicho eso, hay casos en los que funcionará bien. Por ejemplo, si almacenas la tabla en un Heap (no en un clustered index) y los registros son de longitud fija, y nunca borras ninguno, en la práctica los leerás en el mismo orden. Y si la almacenas en un clustered index que agrupe sobre una clave autonumérica (identity), al leer toda la tabla seguirá el oden de la clave primaria y por lo tanto saldrán en el orden en el que se insertaron. Pero esto es "por casualidad", no se garantiza que sea así. Si en alguna versión futura se modifica el optimizador de consultas y (por ejemplo) aplica paralelismo en la recuperación de los datos, o si almacenas la tabla en un filegroup con más de un archivo, o algo similar, puede que de repente deje de respetar este orden y comiencen a salirte desordenados. Así que, en resumidas cuentas, si necesitas orden entonces lo único fiable es poner un ORDER BY al leer los datos.


    Excelente respuesta Alberto, muchas gracias por la aclaración. Muchas gracias por tu tiempo.

    domingo, 14 de febrero de 2021 18:27