2010-11-08 16 views
93

Tengo una tabla A y una tabla B. A tiene una clave externa a B en la clave principal B, B_ID.¿Necesito crear índices en claves externas?

Por alguna razón (Sé que hay razones legítimas) no está utilizando un índice cuando me uno a estos dos mesas en la llave.

¿Es necesario crear un índice en forma separada o debería A.B_ID la existencia de una clave externa que proporcionar?

Respuesta

109

La restricción de clave externa sí sola no proporciona el índice - una necesidad (y debe) ser creado.

+8

En algunas bases de datos creando una restricción de clave externa también crea un índice ... es decir, motor Jet (archivos MSAccess, Firebird y MySQL) – bubi

+3

Esta respuesta no tiene sentido sin referirse explícitamente a una implementación particular de la base de datos. Claro que la pregunta está etiquetada 'oráculo' pero eso no es inmediatamente obvio cuando aterrizas aquí desde una búsqueda en google. – developerbmw

+2

Puedo confirmar que PostgreSQL, al menos en el momento de esta publicación, no lo hace automáticamente. –

35

La creación de una clave externa no crea automáticamente un índice en A.B_ID. Por lo tanto, desde una perspectiva de rendimiento de la consulta, en general tendría sentido crear un índice separado en A.B_ID.

Si alguna vez eliminar filas en B, que debe de A.B_ID a ser indexado. De lo contrario, Oracle tendrá que realizar un escaneo completo de la tabla en A cada vez que elimine una fila de B para asegurarse de que no haya registros huérfanos (según la versión de Oracle, también puede haber implicaciones de bloqueo adicionales, pero éstas disminuyen) en versiones más recientes de Oracle).

12

SQL Server nunca ha puesto índices en las columnas de clave externa de forma automática; echa un vistazo a excellent blog post de Kim Tripp en el fondo y la historia de este mito urbano.

Por lo general es una buena idea para indexar las columnas de clave externa, sin embargo - así que sí, yo recomendaría asegurándose de que cada columna FK está respaldado por un índice; no necesariamente en esa sola columna, tal vez tenga sentido crear un índice en dos o tres columnas con la columna FK como la primera en ese lugar. Depende de su escenario y sus datos.

20

Solo para más información: Oracle no crea un índice automáticamente (como lo hace para las restricciones únicas) porque (a) no es necesario para aplicar la restricción, y (b) en algunos casos no es necesario uno.

La mayoría de las veces, sin embargo, querrá crear un índice (de hecho, en Oracle Apex hay un informe de "claves externas no indexadas").

Cuando la aplicación necesita poder eliminar una fila en la tabla padre, o actualizar el valor PK (que es más raro), el DML sufrirá si no existe un índice, porque tendrá que bloquear toda la tabla secundaria .

Un caso en el que normalmente elegir no para añadir un índice es donde el FK es una tabla "datos estáticos" que define el dominio de una columna (por ejemplo, una tabla de códigos de estado), donde las actualizaciones y elimina en la tabla padre nunca se realiza directamente por la aplicación. Sin embargo, si al agregar un índice en la columna se obtienen beneficios para consultas importantes en la aplicación, el índice seguirá siendo una buena idea.

0

Como con cualquier cosa relacionada con la ejecución, que depende de muchos factores y no hay bala de Silve por ejemplo, en un entorno de actividad muy alto, el mantenimiento de un índice puede ser inaceptable.

Lo más destacado aquí parece ser la selectividad: si los valores en el índice estuvieran muy duplicados, entonces podría ofrecer un mejor rendimiento para soltar el índice (si es posible) y permitir un escaneo de tabla.

3

Por razones de rendimiento, se debe crear un índice.Se utiliza en operaciones de eliminación en la tabla principal (para verificar que el registro que está eliminando no se utiliza) y en combinaciones que generalmente involucran una clave externa. Solo algunas tablas (no las creo en registros) podrían ser que no necesitan el índice, pero probablemente, en este caso, probablemente tampoco necesites la restricción de clave externa.

PERO

Hay algunas bases de datos que ya se crean automáticamente índices de claves externas. Jet Engine (archivos de Microsoft Access) Firebird MySQL

POR CIERTO

SQL Server Oracle

no

+2

Thx por mencionar que FIrebird SQL lo hace automáticamente. Ese es exactamente el punto que estaba buscando. – user424855

Cuestiones relacionadas