none
Truncate Tabla RRS feed

  • Pregunta

  • Estimados.

    Tengo la necesidad de traspasar una gran cantidad de datos desde algunas tablas de una bd a otra bd.

    Entonces he ocupado exportar y tambien lo he tratadod e hacer desde inegration services.

    Para ello desactive todas las constraint de todas las tablas de destino.

    El tema es que cuando el paquete trata de hacer el truncate da error de FK, asi que tuve que hacer un DELETE y luego pasar los datos  (con las constraint deshabilitadas y luego las habilite)

    La duda es porque no se puede hacer con Truncate o si me falta algo para poder hacerlo.

    Saludos.


    DBA SQL Server Santiago/Chile

    martes, 4 de abril de 2017 22:41

Respuestas

  • Una de las reglas del truncate es que no se puede hacer en el caso de que exista alguna otra tabla que tenga un Foreign Key que apunte a la tabla que intentas truncar. La razón debería ser obvia si comprendes cómo funciona el Foreign Key y cuál es la diferencia entre Truncate y Delete.
    • Marcado como respuesta CMAPM miércoles, 5 de abril de 2017 14:47
    miércoles, 5 de abril de 2017 6:21
  • Existe alguna otra manera de hacerlo ?

    Si el origen y el destino se "ven" a la vez (por ejemplo, pertenecen a dos tablas en la misma base de datos, o a dos bases de datos en la misma instancia), entonces puedes usar la sentencia MERGE. Es una sentencia a la que le declaras la tabla de origen y la de destino, y admite tres cláusulas, que indican qué hacer cuando un registro existe en origen pero no en destino (insertarlo), existe en los dos lados (update) o ya no existe en origen (borrarlo del destino). En una sola pasada, hace el mínimo número de cambios requeridos en la tabla de destino, es decir no borra todos los registros para luego volverlos a insertar todos, sino que solo borra los que sobran, y no inserta todos sino solo los nuevos, y a los existentes les actualiza los campos cambiados.
    • Marcado como respuesta CMAPM miércoles, 5 de abril de 2017 20:16
    miércoles, 5 de abril de 2017 18:32
  • Son bases de distintos servidores, funcionara el MERGE si linkeo los server ?

    Funcionará... pero no muy rápido. Por desgracia, los servidores vinculados tienen la mala costumbre de no tener muy buen rendimiento a través del link.

    Si son diferentes servidores, es mejor usar SSIS.

    Si necesitas optimizar el proceso final de inserción de datos una vez que están en el servidor de destino, puedes deshabilitar todos los constraints (¡incluídos los foreign keys!), realizar el truncado e inserción, y volver a habilitar los constraints. Para máxima velocidad, también es recomendable deshabilitar los índices, realizar la inserción de los dos millones de registros, y luego volver a reconstruir los índices. Eso es más rápido que dejar que se indexen los registros sobre la marcha según se van insertando.

    • Marcado como respuesta CMAPM miércoles, 5 de abril de 2017 20:53
    miércoles, 5 de abril de 2017 20:28

Todas las respuestas

  • Una de las reglas del truncate es que no se puede hacer en el caso de que exista alguna otra tabla que tenga un Foreign Key que apunte a la tabla que intentas truncar. La razón debería ser obvia si comprendes cómo funciona el Foreign Key y cuál es la diferencia entre Truncate y Delete.
    • Marcado como respuesta CMAPM miércoles, 5 de abril de 2017 14:47
    miércoles, 5 de abril de 2017 6:21
  • Tuve que hacer Delete de todas las tablas y claro fue lento para luego pasar los datos.

    La verdad es bastante engorroso pasar datos de una tabla a otra, pensando que son un par de millones de registros y tener que hacer delete.

    Tampoco pude crear los insert pues eran tantas filas que no me cargaban en el management ?

    Asi que lo hice de esta manera:

    • Deshabilite las contraint
    • Hice los Delete
    • Pase los datos con SSIS
    • Habilite los constraint

    Existe alguna otra manera de hacerlo ?

    Saludos.


    DBA SQL Server Santiago/Chile

    • Editado CMAPM miércoles, 5 de abril de 2017 14:50
    miércoles, 5 de abril de 2017 14:50
  • Existe alguna otra manera de hacerlo ?

    Si el origen y el destino se "ven" a la vez (por ejemplo, pertenecen a dos tablas en la misma base de datos, o a dos bases de datos en la misma instancia), entonces puedes usar la sentencia MERGE. Es una sentencia a la que le declaras la tabla de origen y la de destino, y admite tres cláusulas, que indican qué hacer cuando un registro existe en origen pero no en destino (insertarlo), existe en los dos lados (update) o ya no existe en origen (borrarlo del destino). En una sola pasada, hace el mínimo número de cambios requeridos en la tabla de destino, es decir no borra todos los registros para luego volverlos a insertar todos, sino que solo borra los que sobran, y no inserta todos sino solo los nuevos, y a los existentes les actualiza los campos cambiados.
    • Marcado como respuesta CMAPM miércoles, 5 de abril de 2017 20:16
    miércoles, 5 de abril de 2017 18:32
  • Estimado Alberto.

    Son bases de distintos servidores, funcionara el MERGE si linkeo los server ?

    Saludos.


    DBA SQL Server Santiago/Chile

    miércoles, 5 de abril de 2017 20:17
  • Son bases de distintos servidores, funcionara el MERGE si linkeo los server ?

    Funcionará... pero no muy rápido. Por desgracia, los servidores vinculados tienen la mala costumbre de no tener muy buen rendimiento a través del link.

    Si son diferentes servidores, es mejor usar SSIS.

    Si necesitas optimizar el proceso final de inserción de datos una vez que están en el servidor de destino, puedes deshabilitar todos los constraints (¡incluídos los foreign keys!), realizar el truncado e inserción, y volver a habilitar los constraints. Para máxima velocidad, también es recomendable deshabilitar los índices, realizar la inserción de los dos millones de registros, y luego volver a reconstruir los índices. Eso es más rápido que dejar que se indexen los registros sobre la marcha según se van insertando.

    • Marcado como respuesta CMAPM miércoles, 5 de abril de 2017 20:53
    miércoles, 5 de abril de 2017 20:28
  • Solo una acotación, dado que hay FK y aun asi los deshabilite no puedo truncar, solo puedo hacer delete. (de echo lo indicaste en tu post mas arriba)

    Muchas Gracias.


    DBA SQL Server Santiago/Chile

    miércoles, 5 de abril de 2017 20:55
  • Tiene que funcionar. Recuerda que hay que deshabilitar los FK en las otras tablas, no en la que vas a truncar.
    miércoles, 5 de abril de 2017 21:13