none
Problemas al cargar datos en SQL RRS feed

  • Pregunta

  • Buenas. Estoy teniendo un problema al registrar datos en una DB SQL Server. Tengo un sistema en C# donde cargo los datos pero el problema es que al verlo en la base de datos me aparece desordenado, no como yo los cargué.

    Cargué 27 productos y el ID se va incrementando automáticamente pero cuando voy a consultar la base de datos me aparece así:

    Porque puede ser que si yo cargo todo en orden, después aparezcan así desordenados?

    Saludos y gracias :D


    Skull

    sábado, 4 de julio de 2020 15:57

Respuestas

  • Porque puede ser que si yo cargo todo en orden, después aparezcan así desordenados?

    Es un error común entre los desarrolladores "novatos". En las bases de datos relacionales NO EXISTE el orden. Cuando insertas registros, se guardan en el almacenamiento interno en cualquier manera que al servidor le venga bien guardarlos, y cuando los consultas, se extraen en cualquier orden en que al servidor le venga bien. El almacenamiento interno es una estructura compleja, que puede ser de varios tipos distintos, no es una "pila" ordenada como aparenta ser la tabla cuando la dibujan en los materiales instructivos. Los registros no quedan cuidadosamente apilados uno encima de otro en el orden en que los insertas, sino que se guardan en un clustered index o en un heap dividido en páginas dependiendo de cómo la declares. Esto hace que no necesariamente queden guardados secuencialmente en el orden en el que los insertaste.

    Para forzar a que los datos se extraigan por orden, hay que poner una cláusula "order by" que indique un campo o campos que sirvan para ordenar. Por ejemplo, "select * from miTabla ORDER BY IdProducto".


    sábado, 4 de julio de 2020 16:50

Todas las respuestas

  • Porque puede ser que si yo cargo todo en orden, después aparezcan así desordenados?

    Es un error común entre los desarrolladores "novatos". En las bases de datos relacionales NO EXISTE el orden. Cuando insertas registros, se guardan en el almacenamiento interno en cualquier manera que al servidor le venga bien guardarlos, y cuando los consultas, se extraen en cualquier orden en que al servidor le venga bien. El almacenamiento interno es una estructura compleja, que puede ser de varios tipos distintos, no es una "pila" ordenada como aparenta ser la tabla cuando la dibujan en los materiales instructivos. Los registros no quedan cuidadosamente apilados uno encima de otro en el orden en que los insertas, sino que se guardan en un clustered index o en un heap dividido en páginas dependiendo de cómo la declares. Esto hace que no necesariamente queden guardados secuencialmente en el orden en el que los insertaste.

    Para forzar a que los datos se extraigan por orden, hay que poner una cláusula "order by" que indique un campo o campos que sirvan para ordenar. Por ejemplo, "select * from miTabla ORDER BY IdProducto".


    sábado, 4 de julio de 2020 16:50
  • Gracias por responder. Lo extraño que en otras tablas si me los trae ordenados sin necesidad de usar el Order By.

    pero bueno, el problema que tenía en mi aplicación en C# ya está solucionado. Gracias :D


    Skull

    sábado, 4 de julio de 2020 18:06
  • Gracias por responder. Lo extraño que en otras tablas si me los trae ordenados sin necesidad de usar el Order By.

    Es pura casualidad. No puedes confiar en que siempre vaya a ser así.

    Si la tabla está creada en un Heap (cosa que ocurre por defecto cuando no tiene clave primaria), entonces se le asignan en disco bloques de 8 KB para guardar datos. Según vas insertando registros, se insertan uno detrás de otro en cada página hasta que no quepan más, y entonces se asigna una nueva página cuando insertas el siguiente registro. Esto típicamente dejará un poco de espacio libre en la página, porque los registros probablemente no tendrán un tamaño que sea un divisor exacto de 8kb. Si en este momento consultas los registros, te saldrán en el mismo orden en el que los grabaste porque lo que hace SQL Server es leer las páginas consecutivamente y tomar los registros tal como los encuentra.

    PERO: Si tus registros son de longitud variable, por ejemplo, si contienen un varchar, entonces no son todos del mismo tamaño. Si en un momento insertas un registro que cabe en ese hueco que antes hemos mencionado que pudo quedarte al final de una página de 8kb, pues entonces aprovecha el hueco y lo mete ahí, en lugar de meterlo al final de la última página. También puede pasar esto si has borrado algún registro y ha quedado un hueco en la página que ocupaba. A partir de este momento te empezarán a salir desordenados los registros de esa tabla, que hasta ese momento siempre te habían salido ordenados.

    Esto se complica si la consulta tiene alguna condición que pueda hacer que el optimizador la paralelice, porque entonces puede leer páginas salteadas que te enrevesen el orden todavía más.

    Y también puede ser que la página no esté en un heap sino en un Clustered Index, en cuyo caso las cosas vuelven a ser distintas. Y no digamos ya si tiene índices secundarios y el optimizador encuentra un índice que cubra la consulta y lee el índice en lugar de la tabla principal.

    Total, que las posibles combinaciones de casos son numerosísimas y además pueden cambiar sobre la marcha. Así que aunque hasta ahora no te haya pasado en ninguna tabla que te salga desordenada, eso no garantiza que no se te puedan desordenar en cualquier momento. La única solución fiable es usar el "order by".


    sábado, 4 de julio de 2020 19:57
  • ¿Alguna novedad sobre la consulta realizada? ¿Han sido útiles las respuestas proporcionadas?  

    lunes, 6 de julio de 2020 15:52
    Moderador