tipo - ¿Por qué SQL Server funciona más rápido cuando indizas una tabla después de llenarla?
update tabla temporal sql server (9)
Tengo un sproc que pone 750K registros en una tabla temporal a través de una consulta como una de sus primeras acciones. Si creo índices en la tabla temporal antes de rellenarlos, el elemento tarda aproximadamente el doble de tiempo en ejecutarse en comparación con cuando indexo después de llenar la tabla. (El índice es un número entero en una sola columna, la tabla que se indexa es solo dos columnas, cada una un entero).
Esto me parece un poco difícil, pero luego no tengo la más firme comprensión de lo que sucede debajo del capó. ¿Alguien tiene una respuesta para esto?
Además de la sobrecarga del índice, ejecutar cada consulta como una transacción es una mala idea por la misma razón. Si ejecuta trozos de insertos (digamos 100) dentro de 1 transacción explícita, también debería ver un aumento en el rendimiento.
Después de realizar grandes operaciones de manipulación de datos, con frecuencia tiene que actualizar los índices subyacentes. Puede hacerlo utilizando la instrucción UPDATE STATISTICS [table].
La otra opción es soltar y volver a crear el índice que, si está realizando grandes inserciones de datos, probablemente realizará las inserciones mucho más rápido. Incluso puede incorporar eso en su procedimiento almacenado.
Es porque el servidor de la base de datos tiene que hacer cálculos cada vez que inserta una nueva fila. Básicamente, terminas reindexando la tabla cada vez. No parece una operación muy costosa, y no lo es, pero cuando haces eso muchos juntos, comienzas a ver el impacto. Es por eso que generalmente desea indexar después de haber llenado sus filas, ya que solo será un gasto de una sola vez.
Esto debido al hecho de que cuando SQL Server indexa la tabla con los datos, puede generar estadísticas exactas de los valores en la columna indexada. En algunos momentos, SQL Server volverá a calcular las estadísticas, pero cuando realice inserciones masivas, la distribución de valores puede cambiar después de que las estadísticas se calcularon la última vez.
El hecho de que las estadísticas estén desactualizadas se puede descubrir en el Analizador de consultas. Cuando ve que en cierta tabla, el número de filas de escaneo esperado difiere mucho del número real de filas procesadas.
Debe usar UPDATE STATISTICS para volver a calcular la distribución de valores después de insertar todos los datos. Después de eso, no se debe observar ninguna diferencia de rendimiento.
NUNCA DEBERÁ crear NUNCA un índice en una mesa vacía si va a cargarlo masivamente inmediatamente después. Los índices deben mantenerse a medida que cambian los datos en la tabla, así que imagínese como si para cada inserción en la tabla el índice estuviera siendo recalculado (lo cual es una operación costosa). Cargue la tabla primero y cree el índice después de terminar con la carga. Esa es la diferencia de rendimiento que se va.
Piénsalo de esta manera.
Dado
unorderedList = {5, 1,3}
orderedList = {1,3,5}agregue 2 a ambas listas.
unorderedList = {5, 1,3,2}
orderedList = {1,2,3,5}
¿Qué lista crees que es más fácil de agregar?
Por cierto, ordenar su entrada antes de la carga le dará un impulso.
Si crea un índice agrupado, afecta la forma en que los datos se ordenan físicamente en el disco. Es mejor agregar el índice después del hecho y dejar que el motor de la base de datos reordene las filas cuando sepa cómo se distribuyen los datos.
Por ejemplo, digamos que necesitas construir una pared de ladrillo con ladrillos numerados para que aquellos con el número más alto estén en la parte inferior de la pared. Sería una tarea difícil si solo le entregaran los ladrillos en orden aleatorio, uno a la vez. No sabría qué ladrillos resultaron ser los más numerados y tendría que derribar el muro. y reconstruirlo una y otra vez. Sería mucho más fácil manejar esa tarea si tuviera todos los ladrillos alineados frente a usted y pudiera organizar su trabajo.
Así es para el motor de la base de datos: si le informa sobre todo el trabajo, puede ser mucho más eficiente que si simplemente lo alimenta por filas.
Si tiene un índice en una tabla, cuando agregue datos a la tabla, SQL Server tendrá que reordenar la tabla para dejar espacio en el lugar apropiado para los nuevos registros. Si agrega muchos datos, tendrá que reordenarlos una y otra vez. Al crear un índice solo después de cargar los datos, el reordenamiento solo debe ocurrir una vez.
Por supuesto, si está importando los registros en orden de índice, no debería importar tanto.
esto se debe a que si los datos que inserta no están en el orden del índice, SQL tendrá que dividir las páginas para dejar espacio para filas adicionales para mantenerlas juntas lógicamente