MS SQL Server

Situaciones de procesamiento lento y bloqueo

Especialmente cuando se utilizan múltiples conexiones (por ejemplo cuando se utilizan múltiples pasos de entrada ó salida a la misma base de datos) recibimos frecuentemente reportes sobre situaciones de procesamiento lento e inclusive bloqueo.

El rendimiento reportado por usuarios mejoró significativamente al deshabilitar el "pooling" de conexiones (probado con MS SQL Server 2000).

Otro problema surge junto con el paso "Actualización". El mismo contiene dos instrucciones: una para buscar los datos y otro para actualizarlos. Esto puede derivar en situaciones de bloqueos inclusive utilizando sólo una (a partir de la versión 3.0), ó dos conexiones.

Los usuarios sufrieron bloqueos luego de crear índices, por lo tanto se sospecha que la creación y actualización de índices bloquea a las tablas por un determinado tiempo

La documentación de SQL de Microsoft ofrece información en este artículo:
Fill factor (factor de llenado): http://technet.microsoft.com/en-us/library/ms177459.aspx

Particularmente:

"Divisiones de Páginas y Consideraciones de Rendimiento

Cuando una nueva fila es añadida a una página de índice que está completa, el motor de base de datos mueve aproximadamente la mitad de las filas a una nueva página para hacer lugar para la nueva fila. Esta reorganización se conoce como una división de página. Una división de página crea lugar para nuevos registros, pero puede tomar tiempo para ejecutarse y hace uso intensivo de los recursos. Además, puede causar fragmentación que causa un aumento en las operaciones de E/S. Un factor de llenado correctamente seleccionado puede reducir la probabilidad de divisiones de página al proveer estacio suficiente para la expansión de índices a medida que se añaden datos a la tabla subyacente".

También ver "Creating indexes" ("Creando índices") en http://technet.microsoft.com/en-us/library/ms190197.aspx:
"Consideraciones de rendimiento: [...] Creando el índice de manera conectada ó desconectada.
Cuando un índice es creado de manera desconectada (por defecto), se mantienen bloqueos exclusivos en la tabla subyacente hata que la transacción que crea el índice finaliza. La tabla es inaccessibe a los usuarios mientra el índice está siendo creado."

--> Basado en esta información la solución sería crear los índices de manera conectada y/o cambiar el factor de llenado.

La sintaxis está descripta aquí: http://technet.microsoft.com/en-us/library/ms188783.aspx

Las opciones para crear un índice son:

PAD_INDEX = { ON | OFF }
| FILLFACTOR = fillfactor
| SORT_IN_TEMPDB = { ON | OFF }
| IGNORE_DUP_KEY = { ON | OFF }
| STATISTICS_NORECOMPUTE = { ON | OFF }
| DROP_EXISTING = { ON | OFF }
| ONLINE = { ON | OFF }
| ALLOW_ROW_LOCKS = { ON | OFF }
| ALLOW_PAGE_LOCKS = { ON | OFF }
| MAXDOP = max_degree_of_parallelism