Necesidad de índices en claves foráneas


30

Estoy luchando con índices, claves primarias y claves externas ... Y la necesidad de tenerlas todas.

Si tengo dos tablas, ambas tienen un número entero como clave principal.
La primera tabla hace referencia a través de un FK a la clave primaria de la segunda tabla.

  • En ambas tablas tengo un índice de clave principal en la columna ID
  • Creé una restricción FK al hacer table1.ref_fieldreferencia a la PK de la segunda tabla ( table2.id)
  • y agregué un índice en table1.ref_field

¿Es esta la mejor manera de organizar estos índices, claves primarias y externas?

Respuestas:


30

Tu diseño es bueno. Si tiene un problema de rendimiento (que no puede conocer en tiempo de diseño), debe crear un índice en la columna table1.ref_field, en el mismo orden (ASC) que la columna table2.id. Esto mejorará el rendimiento de las uniones entre las tablas / columnas. El mantenimiento de cualquier índice conlleva una sobrecarga, por lo que desea comparar ese costo con el beneficio de un rendimiento mejorado.

PostgreSQL no crea automáticamente tales índices en columnas de clave externa que hacen referencia a otras columnas, desafortunadamente, por lo que debe hacerlo usted mismo.

Aquí hay una pregunta de StackOverflow sobre el mismo tema:

Postgres e índices en claves extranjeras y claves primarias

Aquí hay una consulta para ayudar a determinar dónde podría beneficiarse agregar dicho índice:

Postgresql: índices en claves extranjeras


No siempre es desafortunado: si no lo hace DELETEen la tabla referenciada, puede ahorrarle mucha E / S y CPU evitando mantener un índice no utilizado. Creo que debería crearse por defecto, solo tengo una opción para suprimir su creación.
Craig Ringer el

Craig Ringer No solo ELIMINAR puede tener un impacto en eso, si seleccionó del participante a las tablas secundarias, también tendrá problemas de rendimiento. Esta documentación de Oracle explica más: asktom.oracle.com/pls/asktom/…
777Anon
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.