2008-11-10 26 views

Respuesta

59

SQL Server no creará automáticamente un índice en una clave externa. También desde MSDN:

una restricción FOREIGN KEY no tiene a estar vinculado únicamente a una restricción PRIMARY KEY en otra tabla; también puede definirse para hacer referencia a las columnas de una restricción ÚNICA en otra tabla. Una restricción FOREIGN KEY puede contener valores nulos; sin embargo, si cualquier columna de una restricción FOREIGN KEY contiene valores nulos, se omite la verificación de todos los valores que componen la restricción FOREIGN KEY . Para asegurarse de que se verifican todos los valores de una restricción FOREIGN KEY, especifique NOT NULL en todas las columnas participantes.

+0

Toda la evidencia parece indicar que no hay un índice automático en Table1Column. Creó el índice normalmente sin quejarse de SQL Server. –

+0

¿Qué tiene que ver el texto entre comillas con la pregunta o con esa afirmación de que los índices no se crean automáticamente? – John

23

Cuando leí la pregunta de Mike, él pregunta si la Restricción FK creará un índice en la columna FK en la Tabla en la que se encuentra el FK (Tabla 1). La respuesta es no, y en general. (a los efectos de la restricción), no es necesario hacer esto. La (s) columna (s) definida (s) como "OBJETIVO" de la restricción, por otro lado, debe ser un índice único en la tabla referenciada, ya sea una Clave principal o una clave alternativa. (índice único) o la sentencia Crear restricción fallará.

(EDIT: Agregado para tratar explícitamente el comentario a continuación -) Específicamente, al proporcionar la consistencia de los datos que existe una restricción de clave externa. un índice puede afectar el rendimiento de una Restricción de DRI solo para las eliminaciones de una Fila o filas en el lado de FK. Al usar la restricción, durante una inserción o actualización, el procesador conoce el valor FK y debe verificar la existencia de una fila en la tabla referenciada en el lado PK. Ya hay un índice allí. Al eliminar una fila en el lado PK, debe verificar que no haya filas en el lado FK. Un índice puede ser marginalmente útil en este caso. Pero este no es un escenario común.

Aparte de eso, en ciertos tipos de consultas, sin embargo, donde el procesador de consultas necesita encontrar los registros en los muchos lados de una unión que usa esa columna de clave externa. el rendimiento de combinación es aumentado cuando existe un índice en esa clave externa. Pero esta condición es peculiar al uso de la columna FK en una consulta de combinación, no a la existencia de la restricción de clave externa ... No importa si el otro lado de la unión es un PK o simplemente alguna otra columna arbitraria. Además, si necesita filtrar u ordenar los resultados de una consulta basada en esa columna FK, un índice ayudará ... De nuevo, esto no tiene nada que ver con la restricción de clave externa en esa columna.

+8

"y generalmente no hay necesidad de hacer esto ..." - esa declaración es incorrecta, me temo. La indexación de FK puede llevar a un mejor rendimiento en muchas situaciones. –

+0

@Mike, El hecho de que desee utilizar la misma columna en una combinación, (donde un índice podría ayudar) no significa que se requiera un índice para la restricción. También es posible que desee utilizar el índice en un predicado cláusula where, donde también podría ser útil un índice. ¿Esto significa que se requiere un índice solo para el lado FK de la Restricción de DRI? No, un FK en una restricción "generalmente" (excepto para las eliminaciones en el lado PK) no obtiene ningún beneficio de un índice. Usar las columnas FK en una combinación (situación diferente) o, para el caso, en una cláusula Where, es lo que genera los beneficios del índice. –

+1

Si no hay un índice en la clave externa, al eliminar las filas en la tabla a la que se hace referencia se generará una exploración de tabla en la tabla con la clave externa. http://sqlperformance.com/2012/11/t-sql-queries/benefits-indexing-foreign-keys –

4

No, la creación de una clave externa en una columna no crea automáticamente un índice en esa columna.

No poder indexar una columna de clave externa hará que esa tabla se explore cada vez que se borre un registro de la tabla referenciada (principal).

En este ejemplo de esquema:

CREATE TABLE MasterOrder (
    MasterOrderID INT PRIMARY KEY) 

CREATE TABLE OrderDetail(
    OrderDetailID INT, 
    MasterOrderID INT FOREIGN KEY REFERENCES MasterOrder(MasterOrderID) 
) 

OrderDetail se escaneará cada vez que se elimina un registro en la tabla MasterOrder.

Dado que los índices impactan en las inserciones, actualizaciones y eliminaciones, es posible que no siempre desee incurrir en las claves foráneas externas si los registros de la tabla principal nunca se eliminan.

Cuestiones relacionadas