2008-10-17 25 views
28

Me gustaría saber si hay reglas generales para crear un índice o no. ¿Cómo elijo qué campos debo incluir en este índice o cuándo no incluirlos?¿Cómo elegir y optimizar los índices de Oracle?

Sé que siempre depende del entorno y la cantidad de datos, pero me preguntaba si podríamos hacer algunas reglas globalmente aceptadas sobre cómo hacer índices en Oracle.

Respuesta

52

La documentación de Oracle tiene un excelente conjunto de consideraciones para las opciones de indexación: http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/data_acc.htm#PFGRF004

Citando:

  • Considere claves de indexación que se utilizan con frecuencia en las cláusulas WHERE.

  • Considere la posibilidad de indexar claves que se utilizan con frecuencia para unir tablas en sentencias de SQL. Para obtener más información sobre la optimización de combinaciones, consulte la sección "Uso de clústeres Hash para el rendimiento".

  • Elija las teclas de índice que tienen alta selectividad. La selectividad de un índice es el porcentaje de filas en una tabla que tiene el mismo valor para la clave indexada. La selectividad de un índice es óptima si algunas filas tienen el mismo valor. Nota: Oracle crea automáticamente índices, o usa índices existentes, en las claves y expresiones de claves únicas y primarias que usted define con restricciones de integridad. Las columnas de baja selectividad de indexación pueden ser útiles si la distribución de datos es sesgada, de modo que uno o dos valores ocurren con mucha menos frecuencia que otros valores.

  • No utilice índices estándar B-tree en claves o expresiones con pocos valores distintos. Dichas claves o expresiones generalmente tienen una baja selectividad y, por lo tanto, no optimizan el rendimiento a menos que los valores clave frecuentemente seleccionados aparezcan con menos frecuencia que los otros valores clave. Puede utilizar índices de mapa de bits de forma efectiva en tales casos, a menos que el índice se modifique con frecuencia, como en una aplicación OLTP de concurrencia alta.

  • No indexe las columnas que se modifican con frecuencia. Las instrucciones UPDATE que modifican las columnas indexadas y las instrucciones INSERT y DELETE que modifican las tablas indexadas tardan más que si no hubiera ningún índice. Dichas sentencias de SQL deben modificar los datos en índices así como los datos en tablas. También generan deshacer y rehacer adicionales.

  • No indexe las claves que aparecen solo en las cláusulas WHERE con funciones u operadores. Una cláusula WHERE que utiliza una función, distinta de MIN o MAX, o un operador con una clave indexada no pone a disposición la ruta de acceso que utiliza el índice, excepto con índices basados ​​en funciones.

  • Considere la posibilidad de indexar claves externas de restricciones de integridad referencial en los casos en que un gran número de instrucciones INSERT, UPDATE y DELETE coincidentes acceden a las tablas padre e hijo. Tal índice permite UPDATE y DELETE en la tabla padre sin compartir bloqueando la tabla hija.

  • Al elegir indexar una clave, considere si la ganancia de rendimiento para las consultas vale la pérdida de rendimiento para INSERT, UPDATE y DELETE y el uso del espacio requerido para almacenar el índice. Es posible que desee experimentar comparando los tiempos de procesamiento de las sentencias SQL con y sin índices. Puede medir el tiempo de procesamiento con la función de rastreo de SQL.

+0

Esta respuesta está tan llena de sabiduría, gracias. – orokusaki

10

Hay algunas cosas que usted debe siempre índice:

  • claves principales - estos se dan un índice automáticamente (a menos que especifique un índice existente adecuada para Oracle para su uso)
  • claves únicas - estos se dan un índice de forma automática (ídem)
  • claves externas - estos son no indexan automáticamente, pero usted debe agregar una para evitar problemas de rendimiento cuando las restricciones se comprueban

Después de eso, busque otras columnas que son con frecuencia utilizadas para filtrar consultas: un ejemplo típico son los apellidos de las personas.

+0

Bueno, eso no es -exactamente- cierto. Puede crear un PK sin que genere un índice automáticamente, especificando un índice existente para usar. –

+0

Punto justo - He actualizado mi texto –

0

Por lo general, uno pone las columnas de ID por adelantado y generalmente identifican las filas de manera única. Una combinación de columnas también puede hacer lo mismo. Como ejemplo de uso de automóviles ... Etiquetas o placas son únicas y califican para un índice. Ellos (la columna de etiquetas) pueden calificar para la clave principal. El nombre del propietario puede calificar para un índice si va a buscar por nombre. La marca de automóviles realmente no debería tener un índice al principio, ya que no va a variar demasiado. Los índices no ayudan si los datos en la columna no varían demasiado.

Eche un vistazo al SQL: cuáles son las cláusulas where que se muestran. Esos pueden necesitar un índice.

Medida. ¿Cuál es el problema - las páginas/consultas tardan demasiado? qué se está utilizando para las consultas. Crea un índice en esas columnas.

Advertencias: los índices necesitan tiempo para las actualizaciones y el espacio.

y, a veces, los análisis completos de tabla son más rápidos que un índice. las tablas pequeñas se pueden escanear más rápido que obtener el índice y luego golpear la mesa. Mira tus uniones.

1

Busque en la normalización de la base de datos: encontrará muchas reglas buenas y estándares de la industria sobre qué claves deberían existir, cómo deben relacionarse las bases de datos y consejos sobre los índices.

-Adam

4

A partir de la base de datos Oracle 10g Guía de desarrolladores de aplicaciones - Fundamentos, Capítulo 5:

En general, se debe crear un índice en una columna en cualquiera de las siguientes situaciones:

  • La columna se consulta con frecuencia.
  • Existe una restricción de integridad referencial en la columna.
  • Existe una restricción de integridad de clave ÚNICA en la columna.

Utilice las siguientes directrices para determinar cuándo crear un índice:

  • crear un índice si con frecuencia desea recuperar menos de aproximadamente el 15% de las filas de una tabla grande. Sin embargo, este porcentaje de umbral varía mucho, de acuerdo con la velocidad relativa de una exploración de tabla y cómo se agrupan los datos de fila sobre la clave de índice. Cuanto más rápido es el escaneo de la tabla, menor es el porcentaje; cuanto más agrupados estén los datos de fila, mayor será el porcentaje.
  • Columnas de índice que se utilizan para uniones para mejorar el rendimiento de las uniones.
  • Las claves primarias y únicas tienen índices automáticamente, pero es posible que desee crear un índice en una clave externa; vea el Capítulo 6, "Mantenimiento de la integridad de datos en el desarrollo de aplicaciones" para más información.
  • Las tablas pequeñas no requieren índices; si una consulta tarda demasiado, entonces la tabla podría haber crecido de pequeña a grande.

Algunas columnas son buenos candidatos para la indexación. Las columnas con una o más de las siguientes características son buenas candidatas para la indexación:

  • Los valores son únicos en la columna, o hay pocos duplicados.
  • Hay una amplia gama de valores (bueno para índices regulares).
  • Hay un pequeño rango de valores (bueno para los índices de mapa de bits).
  • La columna contiene muchos valores nulos, pero las consultas a menudo seleccionan todas las filas que tienen un valor. En este caso, una comparación que coincida con todos los valores no nulos, tales como:

    DONDE COL_X> = -9.99 * potencia (10.125) es preferible DONDE COL_X NO ES NULO

    Esto se debe a el primero usa un índice en COL_X (suponiendo que COL_X sea una columna numérica).

Columnas con las siguientes características son menos adecuados para la indexación:

  • Hay muchas nulos en la columna y que no buscan en los valores no nulos.
+0

Es peligroso decir > Hay un pequeño rango de valores (bueno para los índices de mapa de bits). Esto arruinará una base de datos OLTP cada vez. –

2

Guau, ese es un tema tan grande, es difícil de responder en este formato. Recomiendo srtongly esto book.

base de datos relacional Índice de Diseño y los optimizadores por Tapio Lahdenmaki

No sólo se utilizan índices para facilitar el acceso de mesa más rápido, a veces se hacen índices para evitar acceso a la tabla por completo. Algo no mencionado aún pero vital.

Hay toda una ciencia para esto si realmente desea que su base de datos funcione al máximo.

Ah, una optimización específica para Oracle está construyendo índices clave inversos. Si tiene un índice PK de un valor que aumenta de manera monoatómica, como una secuencia, y tiene inserciones altamente concurrentes y no planea escanear el rango de esa columna, entonces conviértalo en un índice de clave inversa.

¿Ves cuán específicas pueden ser estas optimizaciones?

Cuestiones relacionadas