11

que tienen una situación como esta:¿Las restricciones de clave externa influyen en las transformaciones de consulta en Oracle?

create table a(
    a_id number(38) not null, 
    constraint pk_a primary key (id) 
); 

create table b(
    a_id number(38) not null 
); 

create index b_a_id_index on b(a_id); 

ahora b.a_id es de hecho la intención de ser una clave externa que hace referencia a.a_id, pero no se ha declarado formalmente como tales. Obviamente, debería ser por razones de integridad. Pero, ¿una restricción de clave externa también mejora el rendimiento de las uniones en general o en casos específicos? En caso afirmativo, ¿para qué tipos de transformaciones de consulta?

¿Hay alguna documentación relevante sobre este tema?

Estoy usando Oracle 11g (11.2.0.2.0)

Respuesta

13

Sí, tener restricciones de clave externa en su lugar puede mejorar el rendimiento de la consulta. Existen varias transformaciones que están abiertas para el optimizador cuando existen restricciones de clave externa apropiadas que generalmente no están disponibles. Por ejemplo, si se uniera a A y B pero solo selecciona datos de B, el optimizador podría eliminar A del plan de consulta por completo si hubiera una restricción de clave externa en su lugar (este tipo de cosas es muy útil cuando tiene Obtuve vistas útiles que se unen en más tablas de las que su consulta actual necesita estrictamente, ya que no tiene que cambiar los costos de rendimiento de las combinaciones adicionales por la reutilización del código al usar una vista existente. También son útiles cuando haces cosas como usar reescritura de consultas para volver a escribir una consulta y utilizar una vista materializada en un sistema de depósito de datos/tipo DSS.

Tom Kyte tiene una presentación Metadata Matters que explica cómo varios tipos de restricciones, junto con otras piezas de metadatos, pueden influir en el optimizador.

+0

Estaba seguro de haber leído algo así antes. Parece obvio de todos modos. Gracias por la gran respuesta y el enlace! –

+1

Enlace roto, supongo que la presentación es ésta: http://docslide.us/documents/metadata-matters-by-tom-kyte-oracle.html – gaps96

1

Como Justin ya se señaló, la eliminación de JOIN es una transformación de SQL esencial sin costo, que se puede aplicar en función de la presencia de metadatos solamente. He blog acerca de esto más recientemente:

Mientras originalmente por sentado, hay una gran cantidad de transformaciones SQL que dependen de los metadatos, por lo que añadir restricciones de clave externa (y otras restricciones) definitivamente puede afectar el rendimiento de una manera positiva.

Cuestiones relacionadas