2010-12-07 38 views
11

En SQL Server 2005, tengo una tabla con dos columnas: parent_id (int) y child id (int). Quiero hacer una clave compuesta de ellos, porque solo quiero exactamente una instancia por combinación posible en la tabla.clave primaria compuesta e índices adicionales

La mayoría de las operaciones de búsqueda se realizarán en el campo parent_id, algunas en el child_id y solo las esporádicas en ambos campos juntas.

He planeado hacer un índice en el campo parent_id y tal vez también uno en el campo child_id. ¿Es esto significativo o es SQL Server 2005 capaz de utilizar la clave primaria compuesta en clúster para búsquedas indexadas en una sola columna (principalmente el parent_id) y, por lo tanto, el índice no es necesario/prescindible?

Respuesta

16

Crea la clave primaria compuesta (parent_id, child_id) para imponer la exclusividad. SQL Server puede usar el compuesto para las búsquedas en ambas columnas o solo parent_id, pero no puede usarlo para las búsquedas en child_id solamente. Si lo necesita, debería crearse un índice separado en child_id.

+0

Sé que esta es una publicación anterior, pero estoy viendo el mismo problema. No entiendo la respuesta. Si tengo una clave compuesta en ParentID y ChildID. ¿Cómo se determina que puede "usar el compuesto para búsquedas en ambas columnas o solo parent_id, pero no puede usarse para búsquedas en child_id solamente. Si lo necesita". ParentID y ChildID son idénticos, entonces, ¿cómo puede usar el índice compuesto para buscar en uno pero no en el otro? – mark1234

+1

@ mark1234: Piénselo como una cadena. No puede alcanzar el nivel ChildID a menos que pase primero por el nivel ParentID. Es por eso que los índices en solo ChildID no pueden usar el índice. No hay filtro ParentID en la consulta para llevarlo a ese ChildID. –

+0

Gracias por su respuesta joe. Ahí es donde estoy confundido. Si solo son dos entradas en una tabla, entonces, ¿por qué usará un índice si digo "WHERE ParentID = 1 y no" Where ChildID = 1 ". ¿Hay algún tipo de ordinalidad en las columnas de un índice? Por ejemplo, Definí composite como (ChildID, ParentID) las consultas en ChildID lo usarían y ParentID's no? – mark1234

Cuestiones relacionadas