Constantemente veo que la gente dice que los índices se ralentizan update
, delete
y insert
. Esto se usa como una declaración general, como si fuera un absoluto.
Mientras ajusto mi base de datos para mejorar el rendimiento, sigo encontrando esta situación que parece contradecir esa regla lógicamente para mí, y en ningún lado puedo encontrar a nadie que diga o explique de otra manera.
En SQL Server, y creo / presumo la mayoría de los otros DBMS, sus índices se crean en función de columnas específicas que especifique. Las inserciones y eliminaciones siempre afectarán a una fila completa, por lo que no hay forma de que no afecten el índice, pero las actualizaciones parecen un poco más únicas, pueden afectar específicamente solo ciertas columnas.
Si tengo columnas que no están incluidas en ningún índice y las actualizo, ¿se ralentizan solo porque tengo un índice en otras columnas de esa tabla?
Como ejemplo, digamos en mi User
tabla que tengo uno o dos índices, la clave principal que es una columna de Identidad / Incremento automático, y posiblemente otra en alguna columna de clave externa.
Si actualizo una columna sin el índice directamente en ella, como decir su número de teléfono o dirección, ¿se ralentiza esta actualización porque tengo índices en esta tabla en otras columnas en cualquier situación? Las columnas que estoy actualizando no están en índices, por lo que lógicamente, los índices no deberían actualizarse, ¿no? En todo caso, creo que se aceleran si uso los índices en la cláusula WHERE.
so there is no way they will not affect the index
a excepción de los índices filtrados ...Respuestas:
Tiene razón en que actualizar una columna no indexada no causará cambios en los índices. En un caso simple, tampoco habría un impacto general sobre la mesa.
Si una consulta puede usar el Índice para buscar datos, puede acelerar la búsqueda, pero el comportamiento exacto (dependiendo de su marca SQL) puede diferir de otras marcas de SQL. (Yo uso principalmente Microsoft SQL Server).
Por supuesto, actualizar una columna con un volumen de datos significativamente mayor podría causar cierto movimiento de las filas a diferentes páginas, etc.
fuente
Para un sistema moderno relativamente rápido, la adición de un índice único a una tabla OLTP probablemente será prácticamente indetectable desde el punto de vista del rendimiento para la gran mayoría de los sistemas . Dicho esto, no debe crear índices innecesarios, y probablemente no debería crear índices de una sola columna para cada columna de una tabla.
Está en lo cierto al suponer que, para muchas consultas, la presencia de índices útiles dará como resultado una mejora de velocidad muy notable.
Aunque su pregunta parece estar relacionada con el rendimiento, existen otros problemas potenciales relacionados con la adición de índices, que incluyen, entre otros:
El tiempo requerido para crear el índice puede resultar en bloqueo mientras el índice se agrega a la tabla. La cerradura tiene una vida muy corta, y lo más probable es que no cree un gran problema.
Los cambios de índice dan como resultado que los planes de ejecución se invaliden para cualquier plan que haga referencia a la tabla subyacente. Cuando esos planes de ejecución se vuelven a compilar, el rendimiento puede cambiar negativamente para algunas consultas.
Las modificaciones de índice pueden dar lugar a consultas que devuelven errores donde no se devolvió ninguno anteriormente. Tomemos el caso de un índice filtrado que se utilizó para devolver fechas contenidas en un campo varchar; si el filtro eliminó las filas que no eran fechas, y ese filtro se modifica posteriormente, las consultas que se basaron en ese índice ahora pueden fallar al intentar convertir datos que no son de fecha.
Un nuevo índice puede hacer que cambie el orden de ejecución, dando lugar a posibles puntos muertos que no se produjeron antes.
fuente
Si la operación de actualización apunta a una columna no indexada de tamaño fijo (como un entero), en general no debería ser lenta, pero en comparación con una instrucción select, la actualización también debe escribirse en el disco lento.
fuente