SQL Server - Exportar tabla grande sin clave primaria

9

Necesito sincronizar una tabla grande ~ 500 millones de filas sin una clave principal entre SQL Server y MySQL. La tabla solo tiene un índice compuesto no agrupado agrupado.

Tengo una conexión ODBC entre los servidores, pero una importación de ~ 8 millones de filas tomó alrededor de 45 minutos, por lo que creo que una importación más grande sería irrazonable ya que pueden producirse interrupciones en cualquier momento. No puedo cambiar la estructura de la tabla existente, puedo agregar otras tablas. Después de una lectura adicional, offset / fetch no es una opción para tablas grandes. "Seleccionar ... donde x entre ... y ..." no es una opción ya que no tengo una clave única.

¿Cómo puedo exportar la tabla en lotes que están garantizados para contener todas las filas? Mi problema es que, dado que la clave agrupada no es única, ordenar después de que no garantice que las filas físicas tengan el mismo orden entre consultas consecutivas y ordenar después de que todas las columnas tomarían demasiado tiempo. ¿Y cómo recomendaría migrar los lotes a través de archivos ODBC o CSV?

Ninguno
fuente
¿Esto se repetirá (operación habitual) o una operación única?
Bogdan Bogdanov
La exportación inicial será una operación única, los cambios de sincronización como nuevos registros o actualizaciones deben ser repetitivos. Los CDC no son una opción, pero investigarán más después de la migración inicial.
nadie el
Creo que para recibir ayuda sobre esto, debe explicar con más detalles todo el proceso (parece que tiene un problema muy complejo)
Bogdan Bogdanov
Usted observa "dado que la clave agrupada no es única, ordenar después de que no garantice que las filas físicas tengan el mismo orden entre consultas consecutivas". Como el orden de las filas no se conserva (a menos que tenga algunos datos de secuencia), no puede confiar en obtener el mismo orden de filas físico. El orden de las filas no tiene por defecto el orden de inserción ni el orden de índice, pero está definido por la cláusula ORDER BY .
RLF
Sí, RLF, estoy de acuerdo. Todas las columnas son entradas, A, B, C, D, E. La clave agrupada está en ABC. Una combinación ABC no es única, ni una combinación ABCD. ¿"Ordenar por" una (s) columna (s) no única (s) me permitiría exportar toda la tabla en lotes? Y Bogdan Bodganov, la plataforma Stack desalienta problemas complejos, es mejor solo abordar la pregunta. ¿Cómo exportar la tabla grande completa lo más rápido posible en lotes sin pérdida de filas?
nadie el

Respuestas:

0

Suponiendo que no tiene actualizaciones o eliminaciones en la tabla de origen, puede probar lo siguiente:
1. Haga una copia de la tabla existente utilizando la sintaxis CTAS (para SQLServer es SELECT * into source_table_copy FROM source_table). Dicha operación es muy rápida incluso para mesas enormes.
2. Agregue un after insertdisparador en el source_tableque se copien los nuevos registros source_table_copy.
3. Ahora, cuando todos los registros nuevos source_tableentren source_table_copytambién, y puede mover datos de la tabla copiada a Mysql en lotes. Por ejemplo, si tiene un enlace entre 2 servidores, todo se puede hacer dentro del cuerpo del procedimiento almacenado TSQL.
Por ejemplo, un fragmento de código que mueve hasta 20 registros al nuevo servidor podría verse como

 --declare table variable to keep deleted records until they delivered to target host 
  BEGIN TRANSACTION;
  DELETE TOP (20) FROM source_table_copy OUTPUT DELETED.* INTO @Table_Var;

  --insert data into linked server , or to csv file
  COMMIT; 

También es posible usar CURSOR para leer datos y luego eliminar con where current ofcláusula.

** Idealmente, debe evitar que las aplicaciones inserten datos en el source_tablepaso 1. Si es absolutamente imposible, utilizaré un after insertdesencadenador que se agrega justo antes del paso 1 y se elimina inmediatamente después de hacerlo, lo que copia los datos en otra tabla que pueda luego fusionarse con source_table_copy.

a1ex07
fuente
Gracias por la solución, estaba intentando algo también, pero con un inserto normal. Probaré la sintaxis CTAS para ver si acelera las cosas. Pregunta de seguimiento, si no le importa: ¿afectaría el "disparador de inserción posterior" al rendimiento?
nadie el
Dado que el cuerpo del disparador es muy simple (solo inserte datos en otra tabla), el impacto en el rendimiento será mínimo.
a1ex07