2009-05-12 16 views
5

Jaki jest najlepszy sposób na zbudowanie tabeli, która będzie reprezentować drzewo? Chcę zaimplementować wybieranie, wstawianie, aktualizowanie i usuwanie, które będzie działało dobrze z dużymi danymi. Wybrany na przykład będzie musiał obsługiwać "Rozwiń WSZYSTKO" - pobieranie wszystkich dzieci (i tam dzieci) dla danego węzła.Jak wdrożyć widok drzewa o wysokiej wydajności w SQL Server 2005

Odpowiedz

8

Użyj CTE.

względu na drzewa jak struktury tabeli:

id parent name 
1 0  Electronics 
2 1  TV 
3 1  Hi-Fi 
4 2  LCD 
5 2  Plasma 
6 3  Amplifiers 
7 3  Speakers 

, ta kwerenda zwróci id, parent i głębokość poziomu, uporządkowane w postaci drzewa:

WITH v (id, parent, level) AS 
     (
     SELECT id, parent, 1 
     FROM table 
     WHERE parent = 0 
     UNION ALL 
     SELECT id, parent, v.level + 1 
     FROM v 
     JOIN table t 
     ON  t.parent = v.id 
     ) 
SELECT * 
FROM v 

id parent name 
1 0  Electronics 
2 1  TV 
4 2   LCD 
5 2   Plasma 
3 1  Hi-Fi 
6 3   Amplifiers 
7 3   Speakers 

Wymień parent = 0 z parent = @parent dostać tylko gałąź drzewa.

Zapewnione jest indeks na table (parent), ta kwerenda będzie skutecznie działać na bardzo dużym stole, ponieważ będzie to rekursywnie użyć INDEX LOOKUP znaleźć wszystko chilrden dla każdego rodzica.

Aby zaktualizować pewną gałąź, problem:

WITH v (id, parent, level) AS 
     (
     SELECT id, parent, 1 
     FROM table 
     WHERE parent = 0 
     UNION ALL 
     SELECT id, parent, v.level + 1 
     FROM v 
     JOIN table t 
     ON  t.parent = v.id 
     ) 
UPDATE table t 
SET  column = newvalue 
WHERE t.id IN 
     (
     SELECT id 
     FROM v 
     ) 

gdzie @parent jest korzeniem branży.

+0

Czy możesz wyjaśnić strukturę tabel? Czy to zapytanie działa dobrze z dużym db? – SirMoreno

+0

dzięki, Jak zrobić głęboką aktualizację? - zaktualizować wszystkie węzły pod rodzicem? (w tym wnuków) – SirMoreno

+0

hej, próbuję to uruchomić, i wygląda na to, że praca vq item dosent, próbuję jednak w 2008 roku.Czy poziom musi być przechowywany w bazie danych, ponieważ nie jest on pokazany w tabeli? –

2

Zapoznaj się z Joe Celko's book on trees and hierarchies, aby uzyskać wiele sposobów rozwiązania problemu hierarchii. Wybrany model będzie zależeć od tego, w jaki sposób sprawdzasz wagę w porównaniu do aktualizacji i złożoności. Możesz wykonać wyszukiwanie dość szybko (zwłaszcza w celu uzyskania wszystkich dzieci w węźle) przy użyciu modelu listy sąsiednich, ale aktualizacje do drzewa są wolniejsze.

+0

Dzięki temu sprawdzę. Czy związek jest bardziej wydajny niż rekurencyjny? Słyszałem, że mssql 2005 ma nowy sposób radzenia sobie z drzewami, czy wiesz, czy działa dobrze z dużymi bazami danych? – SirMoreno

+0

UNION ALL w ramach CTE jest rekursywny, chociaż nie jestem pewien, jak SQL Server obsługuje go za kulisami lub czy są na nim poprawki wydajności. Nie zrobiłem wystarczająco dużo testów na dużą skalę z CTE, aby powiedzieć na pewno o wydajności. –

3

Najpierw musisz zadać sobie następujące pytania: 1) Jaki jest stosunek modyfikacji do odczytów? (= w większości statyczne drzewo lub ciągle się zmienia?) 2) Jak głębokie i duże są twoje drzewa?

Zestawy zagnieżdżone są idealne do przeważnie statycznych drzew, gdzie potrzebne są operacje na całych gałęziach. Obsługuje głębokie drzewa bez problemów.

Zmaterializowana ścieżka działa dobrze dla dynamicznych (zmieniających się) drzew o ograniczonej/przewidywalnej głębokości.

Rekurencyjne CTE są idealne dla bardzo małych drzew, ale operacje w oddziale ("uzyskaj wszystkie dzieci w tej gałęzi ..") stają się bardzo kosztowne z głębokim/dużym drzewem.

+1

Moje drzewo jest bardzo dynamiczne, wiele aktualizacji, ale wiele również wybiera. Chciałbym być w stanie uzyskać głębokie 10-15 poziomów. Znalazłem ten artykuł o zestawach zagnieżdżonych: http://sqlblog.com/blogs/adam_machanic/archive/2006/07/12/swinging-z-tree-to-tree-using-ctes-part-1-adjacency -to-nested-sets.aspx Czy zestawy zagnieżdżone opisane w tym artykule będą moją najlepszą opcją? dzięki. – SirMoreno

0

Dziwię nikt nie wspomniał dzieje z Closure Table . Bardzo wydajny do czytania i dość prosty w pisaniu.

Powiązane problemy