Pregunta

Obtuve un gran trabajo de conversión: 299 Gb de imágenes JPEG, ya en la base de datos, en equivalentes en miniatura para fines de informes y ancho de banda.

He escrito una función SQLCLR segura para subprocesos para hacer el negocio de volver a muestrear las imágenes, un trabajo encantador.

El problema es que cuando lo ejecuto en una instrucción UPDATE (desde el campo PhotoData hasta el campo ThumbData), esto se ejecuta linealmente para evitar condiciones de carrera, usando solo un procesador para volver a muestrear las imágenes.

Entonces, ¿cómo utilizaría mejor los 12 núcleos y la configuración pid raid que tiene esta máquina de base de datos? ¿Es para usar una subconsulta en la cláusula FROM de la declaración de actualización? ¿Es esto todo lo que se requiere para habilitar el paralelismo en este tipo de operación?

De todos modos, la operación se divide en lotes, alrededor de 4000 imágenes por lote (en una consulta en ventana de aproximadamente 391k imágenes), esta máquina tiene muchos recursos para grabar.

¿Fue útil?

Solución

Yo también recomiendo el "round-robin" metodología defendida por kragen2uk y onupdatecascade (las estoy votando). Sé que he leído algo irritante sobre las rutinas CLR y el paralelismo SQL, pero olvido lo que era justo ahora ... pero creo que no juegan bien juntos.

El bit que he hecho en el pasado en tareas similares es configurar una tabla que enumere cada lote de trabajo a realizar. Para cada conexión que inicie, va a esta tabla, administra el siguiente lote, lo marca como procesado, lo procesa, lo actualiza como Listo y se repite. Esto le permite medir el rendimiento, administrar el escalado, permitir paradas y reinicios sin tener que comenzar de nuevo, y le da algo para mostrar cuán completa es la tarea (y mucho menos mostrar que realmente está haciendo algo).

Otros consejos

Compruebe la configuración para el Grado máximo de paralelismo (MAXDOP) en su servidor SQL. También puede establecer el valor de MAXDOP.

Este enlace puede ser útil para usted http://www.mssqltips.com/ tip.asp? tip = 1047

aplausos

¿No podría dividir la consulta en lotes y ejecutar cada lote por separado en una conexión separada? El servidor SQL solo usa paralelismo en una consulta cuando lo desea, y aunque puede detenerlo, o incluso alentarlo (un poco) cambiando el umbral de costo para la opción de paralelismo a O, pero creo que es bastante impredecible.

Una cosa que vale la pena señalar es que solo decidirá si se usa o no el paralelismo en el momento en que se compila la consulta. Además, si la consulta se compila en un momento en que la carga de la CPU es mayor, es menos probable que el servidor SQL considere el paralelismo.

Encuentre algunos criterios para dividir el conjunto en distintos subconjuntos de filas (1-100, 101-200, lo que sea) y luego llame a su declaración de actualización desde varias conexiones al mismo tiempo, donde cada conexión maneja un subconjunto de filas en la mesa. Todas las conexiones deben ejecutarse en paralelo.

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