2010-12-07 10 views
11

In SQL Server 2005 habe ich eine Tabelle mit zwei Spalten: parent_id (int) und child id (int). Ich möchte einen zusammengesetzten Schlüssel daraus machen, da ich nur genau eine Instanz pro möglicher Kombination in der Tabelle haben möchte.Composite-Primärschlüssel und zusätzliche Indizes

Die meisten Suchoperationen werden auf dem Feld parent_id durchgeführt, einige auf der child_id und nur sporadisch auf beiden Feldern zusammen.

Ich habe geplant, einen Index auf dem parent_id Feld und vielleicht auch einen auf dem child_id Feld zu machen. Ist dies sinnvoll oder ist SQL Server 2005 in der Lage, den gruppierten zusammengesetzten Primärschlüssel für indizierte Suchvorgänge in nur einer Spalte (meist parent_id) zu verwenden, und daher ist der Index nicht notwendig/entbehrlich?

Antwort

16

Machen Sie den zusammengesetzten Primärschlüssel (parent_id, child_id), um die Eindeutigkeit zu erzwingen. SQL Server kann das Komposit für Suchvorgänge in beiden Spalten oder nur für die Parent-ID verwenden, es kann es jedoch nicht nur für Suchen unter child_id verwenden. Wenn Sie es benötigen, müsste ein separater Index für child_id erstellt werden.

+0

Ich weiß, das ist ein alter Beitrag, aber ich sehe das gleiche Problem. Ich verstehe die Antwort nicht. Wenn ich einen zusammengesetzten Schlüssel für ParentID und ChildID habe. Wie können Sie feststellen, dass das Composite für Suchvorgänge in beiden Spalten oder nur für die Parent-ID verwendet werden kann, es aber nicht nur für die Suche auf child_id verwendet werden kann. Wenn Sie es benötigen. ParentID und ChildID sind identisch. Wie kann also der zusammengesetzte Index verwendet werden, um nach dem einen, nicht dem anderen Index zu suchen? – mark1234

+1

@ mark1234: Denken Sie darüber nach, wie eine Kette. Sie können die ChildID-Ebene nur erreichen, wenn Sie zuerst die ParentID-Ebene durchlaufen haben. Aus diesem Grund können Indizes für nur ChildID den Index nicht verwenden. Es gibt keinen ParentID-Filter in der Abfrage, um Sie zu dieser ChildID zu führen. –

+0

Danke für die Antwort Joe. Da bin ich verwirrt. Wenn sie nur zwei Ints in einer Tabelle sind, warum wird dann ein Index verwendet, wenn ich sage "WHERE ParentID = 1 und nicht" Wobei ChildID = 1 ". Gibt es irgendeine Art von Ordnungsmäßigkeit für die Spalten in einem Index? Ich definierte Composite als (ChildID, ParentID) würde Abfragen auf ChildID verwenden es und ParentID nicht? – mark1234

Verwandte Themen