Estoy golpeando algunos cuellos de botella de rendimiento con mi cliente C# insertando datos a granel en una base de datos SQL Server 2005 y estoy buscando maneras de acelerar el proceso.¿Cuál es la forma más rápida de insertar a granel una gran cantidad de datos en SQL Server (cliente C#)
Ya estoy usando el SqlClient.SqlBulkCopy (que se basa en TDS) para acelerar la transferencia de datos a través del cable, lo que ayudó mucho, pero aún estoy buscando más.
Tengo una tabla simple que se parece a esto:
CREATE TABLE [BulkData](
[ContainerId] [int] NOT NULL,
[BinId] [smallint] NOT NULL,
[Sequence] [smallint] NOT NULL,
[ItemId] [int] NOT NULL,
[Left] [smallint] NOT NULL,
[Top] [smallint] NOT NULL,
[Right] [smallint] NOT NULL,
[Bottom] [smallint] NOT NULL,
CONSTRAINT [PKBulkData] PRIMARY KEY CLUSTERED
(
[ContainerIdId] ASC,
[BinId] ASC,
[Sequence] ASC
))
estoy insertando datos en fragmentos con un promedio de 300 filas en las que ContainerId y BinId son constantes en cada bloque y el valor de secuencia es 0-n y los valores se clasifican previamente según la clave principal.
El contador de rendimiento% de tiempo de disco pasa mucho tiempo al 100%, por lo que está claro que el disco IO es el problema principal pero las velocidades que obtengo son varios órdenes de magnitud por debajo de una copia de archivo sin formato.
¿Ayuda a cualquier si:
- dejar la llave primaria, mientras que yo estoy haciendo la inserción y volver a crearlo más adelante
- Do inserta en una tabla temporal con el mismo esquema y periódicamente transferirlos a la mesa principal para mantener el tamaño de la tabla donde ocurren las inserciones pequeñas
- ¿Algo más?
- Sobre la base de las respuestas que he conseguido, vamos a aclarar un poco:
Portman: Estoy usando un índice agrupado porque cuando los datos son todos importados que tendrá que acceder a los datos secuencialmente en ese orden. No necesito particularmente que el índice esté allí mientras se importan los datos. ¿Hay alguna ventaja de tener un índice PK no agrupado mientras se realizan las inserciones, en lugar de eliminar la restricción por completo para la importación?
Chopeen: Los datos se generan de forma remota en muchas otras máquinas (mi servidor SQL solo puede manejar alrededor de 10 actualmente, pero me gustaría poder agregar más). No es práctico ejecutar todo el proceso en la máquina local porque tendría que procesar 50 veces más datos de entrada para generar la salida.
Jason: No estoy haciendo ninguna consulta concurrente en la tabla durante el proceso de importación, intentaré soltar la clave principal y ver si eso ayuda.
http://msdn.microsoft.com/en-us/library/ms174335.aspx – JohnB