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
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.
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.
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
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. –
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.
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
Jeśli masz wiele aktualizacji i wybiera, najlepszym rozwiązaniem wydaje się być ścieżka Wyliczanie modelu, który jest krótko opisany tutaj:
http://www.sqlteam.com/article/more-trees-hierarchies-in-sql
Dziwię nikt nie wspomniał dzieje z Closure Table . Bardzo wydajny do czytania i dość prosty w pisaniu.
- 1. Zakres o CTE w SQL Server 2005
- 2. Jak zdefiniować ENUM w SQL Server 2005?
- 3. Hierarchiczne zapytania w SQL Server 2005
- 4. Timer o wysokiej wydajności kontra StopWatch
- 5. Jak dołączyć do pola tekstowego w SQL Server 2005 SQL Server 2005
- 6. SQL Server 2005: Deadlock transakcji
- 7. dołączyć trzy tabele w SQL Server 2005
- 8. SQL Server 2005: Jak odjąć 6 miesięcy
- 9. Łączy ntext w programie SQL Server 2005
- 10. Pomiń pierwszy wiersz w SQL Server 2005?
- 11. Jak odbudować widok w SQL Server 2008
- 12. Jak powinienem używać BIT w SQL Server 2005
- 13. Jak zrzucić tymczasowe SP, jeśli istnieje w Sql Server 2005
- 14. SQL Server 2005: Dlaczego transakcje nazw?
- 15. Zasoby dla komputerów o wysokiej wydajności w C++
- 16. Wyświetlanie danych w czasie rzeczywistym o wysokiej wydajności
- 17. Jak mogę dokumentować tabele i pola w SQL Server 2005
- 18. Zapytanie Active Directory z SQL Server 2005
- 19. SQL Server 2005 - usuwanie wyzwalaczy tabel?
- 20. Jak odzyskać bazę danych z MDF w SQL Server 2005?
- 21. SQL Server 2005: Określ typ danych zmiennej
- 22. Sql server Integration Services kompatybilność 2008-2005
- 23. Jak wdrożyć stronę internetową w Internecie. (ASP.NET i SQL Server)
- 24. SQL Server 2005: zerowalny klucz obcy
- 25. SQL Server 2005 implementacja MySQL REPLACE INTO?
- 26. Obliczona kolumna SQL Server 2005 jest utajniona
- 27. SQL Server 2005 Datownik Data Zapytanie
- 28. SQL Server 2005 ORDER BY z wyrazem
- 29. SQL Server 2005 - Sprawdź wartość zerową DateTime
- 30. Jak mapować uint w NHibernate z SQL Server 2005
Czy możesz wyjaśnić strukturę tabel? Czy to zapytanie działa dobrze z dużym db? – SirMoreno
dzięki, Jak zrobić głęboką aktualizację? - zaktualizować wszystkie węzły pod rodzicem? (w tym wnuków) – SirMoreno
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? –