Pregunta

fin he conseguido mi lote insertar al trabajo y ahora que he estado jugando con el tamaño del lote, pero no puedo ver ninguna diferencia en el rendimiento entre un valor de 50 y un valor de 10000. Esto parece muy extraño para mí, pero no sé lo que está pasando detrás de la escena, por lo que podría ser un comportamiento normal.

Estoy insertando 160k filas en una tabla y el tiempo medio de mis valores evaluados es de 115 +/- 2 segundos. Sin procesamiento por lotes que tarda 210 segundos, por lo que estoy bastante satisfecho con la mejora. La tabla de destino es:

CREATE TABLE [dbo].[p_DataIdeas](
    [wave] [int] NOT NULL,
    [idnumber] [int] NOT NULL,
    [ideaID] [int] NOT NULL,
    [haveSeen] [bit] NOT NULL CONSTRAINT [DF_p_DataIdeas_haveSeen]  DEFAULT ((0)),
  CONSTRAINT [PK_p_DataIdeas] PRIMARY KEY CLUSTERED 
(
  [wave] ASC,
  [idnumber] ASC,
  [ideaID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON
) ON [PRIMARY]
) ON [PRIMARY]

Lo que debe buscar la hora de establecer UpdateBatchSize la respuesta fue simplemente probar un par de diferentes valores. Puedo entender que, aunque no debería ser posible calcular o al menos conjeturar un valor bueno si se conoce el diseño de la tabla, la cuestión de SQL y los datos que están a punto de ser insertada?

¿Hay mejores prácticas por ahí que alguien puede recomendar?

¿Fue útil?

Solución

Se puede ver el efecto de dosificación sea examinado de SQL o llamando SqlConnection.RetrieveStatistics(). Lo que debería ver es que cada lote corresponde a una sola de ida y vuelta a la base de datos.

En cuanto a la forma de optimizar el tamaño del lote, una regla de oro, muy áspera es que el rendimiento tiende a dejar de mejorar con el tamaño de los lotes por encima de unos 50 - de hecho, a veces los lotes más grandes pueden funcionar más lentamente que los más pequeños. Si estoy demasiado ocupado para prueba, que generalmente comienzan con un lote de alrededor de 20 (a menos que esté usando parámetros valorados de mesa, donde los lotes hasta 500 puede ser más rápido que los más pequeños). Sin embargo, el número óptimo depende de cosas como el tamaño total de las inserciones (Tendrán todos caber en la RAM), la rapidez de los discos es que su registro de base de datos se encuentra en, si el registro está en una unidad / LUN de su propia ( Potencia del costo grande si no lo es), etc.

La velocidad alcanzable está limitada generalmente por primera vez por el número de idas y vueltas, y luego por tamaño de la transacción, y luego ingrese la velocidad del disco (sobre todo si el acceso secuencial es posible o si se ve obligado a debido al azar a la competencia con otros archivos en los mismos husillos) y, finalmente, la memoria RAM. Sin embargo, todos los factores relacionados entre sí también-hasta cierto punto.

El primer paso en la mejora de la perforación de sus inserciones sería hacer ellos en operaciones - tal vez una transacción cada lote o dos. Más allá de eso, los parámetros con valores de tabla es probablemente el siguiente paso, usando un procedimiento almacenado con INSERT INTO Table SELECT column FROM @TableArgument.

Otros consejos

A pesar de que el cambio de UpdateBatchSize ayudará en cierta medida, el enfoque básico de utilizar un adaptador de datos para actualizar una gran cantidad de registros que va a ser lento. Esto se debe a que, en última instancia, una instrucción SQL por separado (insertar, actualizar o borrar) será generado por el adaptador de datos para cada fila. UpdateBatchSize sólo afecta a cuántos de esos estados individuales son enviados en un solo lote TSQL cuando se envían a SQL Server.

Para obtener mejoras en el rendimiento mucho más grandes, que desea SQL Server para insertar / actualizar / eliminar en muchos registros de una instrucción (típicamente usando un JOIN de algún tipo). Tabla valorados parámetros (como se mencionó por RickNZ) es una forma de hacer esto. Otra posibilidad es usar SqlBulkCopy (aunque se le suele necesitar utilizar una tabla de etapas para esto).

Asegúrese de que también hay una transacción activa que mejorará en gran medida el rendimiento (alrededor de 30 veces en mis pruebas utilizando MySqlDataAdapter).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top