Pregunta

Cuando se trabaja con tablas en Oracle, ¿cómo se puede saber cuándo se está configurando un índice bueno o uno malo?

¿Fue útil?

Solución

Esto depende de lo que entiendas por "bueno" y "malo".Básicamente, debe darse cuenta de que cada índice que agregue aumentará el rendimiento en cualquier búsqueda realizada por esa columna (por lo que agregar un índice a la columna 'apellido' de una tabla de personas aumentará el rendimiento en consultas que tengan "donde apellido = " en ellas), pero disminuir el rendimiento de escritura en toda la tabla.

La razón de esto es que cuando agrega o actualiza una fila, debe agregar o actualizar tanto la tabla en sí como cada índice al que pertenece esa fila.Entonces, si tiene cinco índices en una tabla, cada adición debe escribir en seis lugares (cinco índices y la tabla) y una actualización puede tocar hasta seis lugares en el peor de los casos.

La creación de índices es un acto de equilibrio entre la velocidad de consulta y la velocidad de escritura.En algunos casos, como en un datamart que sólo se carga con datos una vez a la semana en un trabajo nocturno pero que se consulta miles de veces al día, tiene mucho sentido sobrecargarlo con índices y acelerar las consultas tanto como sea posible.Sin embargo, en el caso de los sistemas de procesamiento de transacciones en línea, conviene intentar encontrar un equilibrio entre ellos.

En resumen, agregue índices a las columnas que se usan mucho en consultas seleccionadas, pero trate de evitar agregar demasiados y, por lo tanto, agregue primero las columnas más utilizadas.

Después de eso, es cuestión de realizar pruebas de carga para ver cómo reacciona el rendimiento en condiciones de producción y realizar muchos ajustes para encontrar un equilibrio aceptable.

Otros consejos

Los campos que son diversos, muy específicos o únicos constituyen buenos índices.Como fechas y marcas de tiempo, números incrementales únicos (comúnmente utilizados como claves principales), nombres de personas, números de matrícula, etc.

Un contraejemplo sería el género: solo hay dos valores comunes, por lo que el índice realmente no ayuda a reducir la cantidad de filas que se deben escanear.

Las cadenas descriptivas de longitud completa y de forma libre generan índices deficientes, ya que quien realiza la consulta rara vez conoce el valor exacto de la cadena.

Los datos ordenados linealmente (como marcas de tiempo o fechas) se usan comúnmente como índice agrupado, lo que obliga a que las filas se almacenen en orden de índice y permite el acceso en orden, lo que acelera enormemente las consultas de rango (p. ej.'dame todos los pedidos de venta entre octubre y diciembre').En tal caso, el motor de base de datos puede simplemente buscar el primer registro especificado por el rango y comenzar a leer secuencialmente hasta llegar al último.

Aquí hay un excelente artículo sobre SQL Server:http://www.sql-server-performance.com/tips/optimizing_indexes_general_p1.aspx

Aunque la mecánica no funcionará en Oracle, los consejos son muy apropiados (menos lo de los índices agrupados, que no funcionan de la misma manera en Oracle).

@Infamous Cow: debes estar pensando en claves primarias, no en índices.

@Xenph yan - algo que otros no han tocado es elegir lo que amable de índice a crear.Algunas bases de datos realmente no ofrecen muchas opciones, pero otras tienen una gran variedad de índices posibles.Los árboles B son los por defecto pero no siempre es el mejor tipo de índice.La elección de la estructura adecuada depende del tipo de uso que espera tener.¿Qué tipo de consultas necesitas atender más?¿Se encuentra en un entorno de lectura o escritura principalmente?¿Sus escrituras están dominadas por actualizaciones o anexos?Etcétera etcétera.

Una descripción de los diferentes tipos de índices y sus ventajas y desventajas está disponible aquí: http://20bits.com/2008/05/13/interview-questions-database-indexes/ .

Algunas reglas generales si está intentando mejorar una consulta en particular.

Para una tabla en particular (donde cree que debería comenzar Oracle), intente indexar cada una de las columnas utilizadas en la cláusula WHERE.Coloque primero las columnas con igualdad, seguidas de las columnas con un rango o similar.

Por ejemplo:

WHERE CompanyCode = ? AND Amount BETWEEN 100 AND 200

Si las columnas son de tamaño muy grande (p. ej.está almacenando algo de XML o algo así), es mejor que los deje fuera del índice.Esto hará que el índice sea más pequeño para escanear, asumiendo que de todos modos tiene que ir a la fila de la tabla para satisfacer la lista de selección.

Alternativamente, si todos los valores de las cláusulas SELECT y WHERE están en el índice, Oracle no necesitará acceder a la fila de la tabla.Por lo tanto, a veces es una buena idea colocar los valores seleccionados al final del índice y evitar el acceso a la tabla por completo.

Podría escribir un libro sobre las mejores formas de indexar; busque al autor Jonathan Lewis.

Un buen índice es algo en lo que puede confiar que será único para una fila específica de la tabla.

Un esquema de índice comúnmente utilizado es el uso de números que se incrementan en 1 para cada fila de la tabla.Cada fila terminará teniendo un índice numérico diferente.

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