Inserciones rápidas; BulkCopy con datos relacionales.

insert sql sqlbulkcopy sql-server

Pregunta

Tengo una gran cantidad de datos entrantes constantemente (aproximadamente 10,000 por minuto, y en crecimiento) que quiero insertar en una base de datos de la manera más eficiente posible. En este momento estoy usando instrucciones de inserción preparadas, pero estoy pensando en usar la clase SqlBulkCopy para importar los datos en trozos más grandes.

El problema es que no estoy insertando en una sola tabla: los elementos del elemento de datos se insertan en numerosas tablas y sus columnas de identidad se usan como claves externas en otras filas que se insertan al mismo tiempo. Entiendo que las copias masivas no están diseñadas para permitir inserciones más complejas como esta, pero me pregunto si vale la pena intercambiar mis columnas de identidad (bigints en este caso) por columnas identificadoras únicas. Esto me permitirá hacer un par de copias masivas para cada tabla, y dado que puedo determinar las ID antes del inserto, no necesito verificar nada como SCOPE_IDENTITY que me impide usar la copia masiva.

¿Suena esto como una solución viable, o hay otros problemas potenciales que podría enfrentar? O, ¿hay otra forma en que pueda insertar datos rápidamente, pero conservo mi uso de las columnas de identidad bigint?

Gracias.

Respuesta aceptada

Parece que está planeando intercambiar "SQL asigna una clave sustituta de [bigint identity ()] con una" rutina de preparación de datos que evalúa una metodología de clave sustituta GUID ". En otras palabras, la clave no se asignará dentro de SQL, sino desde fuera de SQL. Dados sus volúmenes, si el proceso de generación de datos puede asignar una clave sustituta, definitivamente seguiría con eso.

Entonces, la pregunta es: ¿debe usar GUID o su proceso de generación de datos puede producir enteros auto-incrementales? Crear un proceso que funcione de manera constante e infalible es difícil (una de las razones por las que paga $$$ por SQL Server), pero la compensación por claves más pequeñas y más legibles por humanos dentro de la base de datos puede valer la pena.


Respuesta popular

El identificador único probablemente empeorará las cosas: la página se divide y se ensancha. Ver esto

Si su carga es / puede ser por lotes, una de las opciones es:

  • carga una mesa de ensayo
  • cargar las tablas reales de una sola vez como un procedimiento almacenado
  • use un identificador único en la tabla de preparación para cada lote

Nos ocupamos de picos de alrededor de 50k filas por segundo (y aumentamos de esta manera). En realidad, utilizamos una base de datos provisional para evitar las escrituras de registro de doble transacción)



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué