Ist Rekursion in SQL Server gut?

8

Ich habe eine Tabelle in SQL Server, die die normale Baumstruktur von Item_ID, Item_ParentID hat. Angenommen, ich möchte alle CHILDREN einer bestimmten Item_ID (auf jeder Ebene) durchlaufen und erhalten.

Rekursion scheint ein intuitiver Kandidat für dieses Problem zu sein, und ich kann eine SQL Server-Funktion schreiben, um dies zu tun.

Beeinflusst dies die Leistung, wenn meine Tabelle viele Datensätze enthält? Wie vermeide ich Rekursion und frage einfach die Tabelle ab? Bitte irgendwelche Vorschläge?

    
Julius A 10.10.2008, 13:16
quelle

8 Antworten

4

Mit dem neuen MS SQL 2005 könnten Sie das WITH Schlüsselwort

verwenden

Sehen Sie sich diese Frage und insbesondere dies antwort .

Mit Oracle könnten Sie das Schlüsselwort CONNECT BY verwenden, um hierarchische Abfragen zu generieren ( Syntax ).

AFAIK mit MySQL müssen Sie die Rekursion verwenden.

Alternativ könnten Sie immer eine Cache-Tabelle für Ihre Datensätze Eltern- & gt; Kind-Beziehungen

erstellen     
Ilya Kochetov 10.10.2008, 13:24
quelle
2

Als eine allgemeine Antwort ist es möglich, ziemlich komplizierte Dinge in SQL Server zu tun, die normalerweise Rekursion benötigen, einfach durch Verwendung eines iterativen Algorithmus. Es gelang mir, einen XHTML-Parser in Transact SQL zu erstellen, der erstaunlich gut funktionierte. Der Code-Prettifier, den ich geschrieben habe, wurde in einer gespeicherten Prozedur ausgeführt. Es ist nicht elegant, es ist eher, als würde man Büffel beim Ballet spielen sehen. aber es funktioniert.

    
Phil_Factor 10.10.2008 14:04
quelle
1

Verwenden Sie SQL 2005?

Wenn dies der Fall ist, können Sie Common Table Expressions dafür verwenden. Etwas in dieser Richtung:

%Vor%     
AlexCuse 10.10.2008 13:30
quelle
1

Das Problem, auf das Sie bei der Rekursion und der Leistung stoßen, ist, wie oft es sich wiederholen muss, um die Ergebnisse zurückzugeben. Jeder rekursive Aufruf ist ein weiterer separater Aufruf, der zu den Gesamtergebnissen hinzugefügt werden muss.

In SQL 2k5 können Sie einen gemeinsamen Tabellenausdruck verwenden, um diese Rekursion zu behandeln:

%Vor%

oder eine andere Lösung besteht darin, die Hierarchie in eine andere Tabelle zu reduzieren

Mitarbeiter_Manager
ManagerId (PK, FK zu Employee-Tabelle)
EmployeeId (PK, FK zu Employee-Tabelle)

Alle übergeordneten untergeordneten Beziehungen werden in dieser Tabelle gespeichert. Wenn also Manager 1 Manager 2 verwaltet, wird Mitarbeiter 3 verwaltet. Die Tabelle sieht folgendermaßen aus:

%Vor%

Damit kann die Hierarchie leicht abgefragt werden:

%Vor%

Dies würde alle Mitarbeiter zurückgeben, die Manager 42 haben. Der Vorteil ist eine höhere Leistung, aber die Hierarchie wird beibehalten.

    
jjacka 10.10.2008 13:51
quelle
1

Joe Celko hat ein Buch (& lt; - Link zu Amazon) speziell auf Baumstrukturen in SQL-Datenbanken. Während Sie für Ihr Modell eine Rekursion benötigen würden und dort durchaus ein Potenzial für Performance-Probleme bestünde, gibt es alternative Möglichkeiten, eine Baumstruktur zu modellieren, abhängig davon, was Ihr spezifisches Problem beinhaltet, was Rekursion vermeiden und eine bessere Performance ermöglichen könnte.

    
Tom H 10.10.2008 14:37
quelle
0

Vielleicht ist mehr Detail in Ordnung.

Wenn Sie eine Master-Detail-Beziehung haben, wie Sie beschreiben, wird dann nicht ein einfacher JOIN bekommen, was Sie brauchen?

Wie in:

%Vor%     
JosephStyons 10.10.2008 13:18
quelle
0

Sie sollten keine Rekursion für Kinder brauchen - Sie betrachten nur die Ebene direkt darunter (zB select * from T where ParentId = @parent ) - Sie brauchen nur Rekursion für alle Nachkommen .

In SQL2005 können Sie die Nachkommen mit erhalten:

%Vor%     
Keith 10.10.2008 13:34
quelle
0

Sie brauchen überhaupt keine Rekursion. Beachten Sie, dass ich die Spalten in ItemID und ItemParentID geändert habe, um die Eingabe zu vereinfachen ...

%Vor%     
Cervo 10.10.2008 15:37
quelle

Tags und Links