Typy danych hierarchyid (aparat bazy danych)
hierarchyid Typ danych jest warunkiem do systemu.Użyj hierarchyid jako typ danych, utworzenie tabel z hierarchiczną strukturę lub odwołać hierarchiczna struktura danych w innej lokalizacji.Użyj hierarchyid funkcje do wykonywania kwerend i wykonywać pracę z danymi hierarchicznymi za pomocą Transact-SQL.
Hierarchicznych danych jest zdefiniowany jako zestaw elementów danych, które są powiązane ze sobą przez hierarchicznego.Relacje hierarchiczne są, gdzie jeden element danych jest elementem nadrzędnym innego elementu.Hierarchiczne danych jest często w bazach danych.Następujące przykłady:
Struktura organizacyjna
System plików
Zestaw zadań w projekcie
Taksonomia terminów języka
Wykres łącza między stronami sieci Web
Nowe w SQL Server 2008, hierarchyid typu ułatwia magazynu i kwerendy hierarchicznych danych.hierarchyidjest zoptymalizowany pod kątem reprezentujących drzew, które są najczęściej spotykany typ danych hierarchicznych.
Właściwości klucza hierarchyid
Wartość hierarchyid Typ danych reprezentuje pozycję w hierarchii drzewa.Wartości hierarchyid mają następujące właściwości:
Bardzo zwarte
Średnia liczba bitów, które są wymagane do reprezentowania węzła w drzewie z n węzły zależy od średniego fanout (średnia liczba dzieci węzła).Dla małych fanouts, (0-7) rozmiar jest około 6 * dziennikaan bitów, gdzie a jest średnia fanout.Węzeł w hierarchii organizacyjnej 100 000 osób ze średnią fanout 6 poziomów zajmuje około 38 bitów.To jest zaokrąglana w górę do 40 bitów lub 5 bajtów magazynu.
Porównanie jest w kolejności głębokości pierwszy
Biorąc pod uwagę dwa hierarchyid wartości i b, <b oznacza wcześniejsza b w przechodzenie pierwszego Głębokość drzewa.Indeksy na hierarchyid typy danych są w kolejności głębokości pierwszy i węzłów zbliżone do siebie przechodzenie głębokość pierwszej znajdują się blisko siebie.Na przykład dzieci rekordu są przechowywane w przyległych do tego rekordu.
Wsparcie dla dowolnego wstawienia i usunięcia
Za pomocą GetDescendant metoda jest zawsze można wygenerować równorzędny prawo danego węzła po lewej stronie dowolny węzeł lub między dowolnym dwa elementy równorzędne.Porównania właściwość jest zachowywane po dowolnej liczby węzłów jest wstawiony lub usunięty z hierarchii.Większość wstawienia i usunięcia zachować właściwość zwartość.Jednakże wstawienia między dwoma węzłami da hierarchyid wartości z nieco mniej CD reprezentacji.
Ograniczenia hierarchyid
hierarchyid Typ danych ma następujące ograniczenia:
Kolumna typu hierarchyid automatycznie reprezentują drzewa.Do aplikacji do generowania i przypisywania hierarchyid wartości w taki sposób, że żądaną relację między wierszami są odzwierciedlone w wartości.Niektóre aplikacje nawet warto mieć kolumna typu hierarchyid reprezentują drzewa.Prawdopodobnie wartości są odwołaniami do lokalizacji w hierarchii zdefiniowany w innej tabela.
Do aplikacji do zarządzania współbieżność generowania i przypisywania hierarchyid wartości.Nie ma żadnej gwarancji, hierarchyid wartości kolumna są unikatowe, chyba że aplikacja używa unikatowego ograniczenia na klucz lub Wymusza unikatowość sam za pośrednictwem własnej logiki.
Relacje hierarchiczne reprezentowane przez hierarchyid wartości nie są wymuszane jak klucz obcy relacji.Jest to możliwe i właściwe czasami mają relacji hierarchicznych, gdzie a ma podrzędność B, a następnie A, skreśla się pozostawienie b w relacji do nieistniejącego rekordu.Jeśli to zachowanie jest niedopuszczalne, aplikacja musi przed usunięciem rodziców kwerendy dla obiektów podrzędnych.
Strategie indeksowania
Istnieją dwie strategie indeksowania hierarchicznych danych:
Głębokość pierwszy
Indeks pierwszego głębokość, wiersze znajdujące się w poddrzewie znajdują się blisko siebie.Na przykład raport za pomocą Menedżera wszystkich pracowników są przechowywane w pobliżu ich menedżerów rekord.
Szerokość pierwszej
Pierwszy szerokość przechowuje wiersze każdy poziom hierarchii razem.Na przykład rekordy pracowników, którzy składają raporty bezpośrednio do tego samego menedżera znajdują się blisko siebie.
Przykłady
GetLevel() Metoda może służyć do tworzenia szerokość pierwszego zamawiania.W poniższym przykładzie są tworzone indeksy pierwszego szerokość i głębokość pierwszy:
USE AdventureWorks2008R2 ;
GO
CREATE TABLE Organization
(
BusinessEntityID hierarchyid,
OrgLevel as BusinessEntityID.GetLevel(),
EmployeeName nvarchar(50) NOT NULL
) ;
GO
Indeks pierwszego głębokość znajdują są wszystkie węzły w poddrzewie węzła.Głębokość pierwszego indeksy są zatem skuteczne dla odpowiedzi na kwerendy dotyczące poddrzew, takich jak "Znaleźć wszystkie pliki w tym folderze i jego podfolderów".
CREATE CLUSTERED INDEX Org_Breadth_First
ON Organization(OrgLevel,BusinessEntityID) ;
GO
CREATE UNIQUE INDEX Org_Depth_First
ON Organization(BusinessEntityID) ;
GO
Indeks pierwszego szerokość znajdują są wszystkie bezpośrednie elementy podrzędne węzła.Szerokość pierwszej indeksy są zatem skuteczne dla odpowiedzi na kwerendy dotyczące bezpośrednie elementy podrzędne, takie jak "Znaleźć wszystkich pracowników, którzy podlegają bezpośrednio ten Menedżer".
Czy pierwszy głębokość, pierwszy szerokość lub oba i którym z klastrowanie klucz (jeśli ma zastosowanie), zależy od względnego znaczenia powyższe rodzaje kwerend oraz względnego znaczenia zaznacz vs.Operacje DML.Na przykład szczegółowe strategii indeksowania, zobacz Samouczek: Za pomocą hierarchyid, typ danych.
Kiedy użycie alternatywnych dla hierarchyid
Dwa rozwiązania alternatywne do hierarchyid reprezentujące hierarchiczne danych są:
Nadrzędny i podrzędny
XML
hierarchyid jest ogólnie nadrzędne w stosunku do tych alternatyw.Jednak istnieją sytuacje wyszczególnione poniżej których prawdopodobne superior alternatyw.
Nadrzędny i podrzędny
Jeżeli zastosowano podejście nadrzędny i podrzędny, każdy wiersz zawiera odwołanie do obiektu nadrzędnego.W poniższej tabela opisano typowe tabela zawiera nadrzędne i podrzędność wiersze w relacji typu nadrzędny i podrzędność:
USE AdventureWorks2008R2 ;
GO
CREATE TABLE ParentChildOrg
(
BusinessEntityID int PRIMARY KEY,
ManagerId int REFERENCES ParentChildOrg(BusinessEntityID),
EmployeeName nvarchar(50)
) ;
GO
Porównanie nadrzędny i podrzędny i hierarchyid dla typowych operacji
Kwerendy poddrzewa są znacznie szybsze, z hierarchyid.
Bezpośrednie kwerendy podrzędne są nieco wolniej, z hierarchyid.
Przenoszenie węzłów typu nie liść jest wolniejsze z hierarchyid.Wstawianie węzłów typu nie liść i wstawianie lub przenoszenie węzłów liściowych ma złożoność tych samych hierarchyid.
Nadrzędny i podrzędny może być przełożonego, gdy następujące warunki:
Rozmiar klucz jest bardzo krytycznej.Na tę samą liczbę węzłów hierarchyid wartość jest równa lub większa niż całkowita family (smallint, int, bigint) wartość.Jest to tylko powód, aby użyć nadrzędny i podrzędny w rzadkich przypadkach, ponieważ hierarchyid została znacznie korzystniejszą miejscowości złożoności We/Wy i Procesora niż typowe wyrażenia tabela wymagane podczas używania struktury nadrzędny i podrzędny.
Kwerendy rzadko kwerendy w sekcjach hierarchii.Innymi słowy Jeśli kwerendy zwykle adres pojedynczego punktu w hierarchii.W takich przypadkach kolokacji nie jest ważna.Na przykład nadrzędny i podrzędny jest przełożonego, jeśli tabela organizacji jest używane tylko dla z listy płac dla poszczególnych pracowników.
Non -liść poddrzew przenieść często i wydajność jest bardzo ważne.W reprezentacji nadrzędny i podrzędność zmiany lokalizacji w hierarchii wiersz dotyczy pojedynczego wiersza.Zmienianie lokalizacji wiersza w hierarchyid wpływa na sposób użycia n wierszy, gdzie n jest przenoszony liczby węzłów w poddrzewa.
Jeśli tego typu nie liść poddrzew przenieść często bardzo ważne jest wydajność, ale większość ruchy są dobrze poziom hierarchii, należy rozważyć rozdzielenie wyższe i niższe pozioms do dwóch hierarchii.Dzięki temu wszystkie przenosi do liść-poziomów hierarchii wyższe.Dla wystąpienie, należy rozważyć hierarchii witryn sieci Web obsługiwanych przez usługa.Witryny zawierają wiele stron, rozmieszczone w sposób hierarchiczny.Witryny obsługiwane mogą być przeniesione do innej lokalizacji w hierarchii witryny, ale strony podrzędne są rzadko re-arranged.Może to być reprezentowane za pośrednictwem:
CREATE TABLE HostedSites ( SiteId hierarchyid, PageId hierarchyid ) ; GO
XML
Dokument XML jest drzewo i stanowić kompletne hierarchii pojedyncze wystąpienie typu danych XML.W SQL Server podczas tworzenia indeksu XML hierarchyid wartości są używane wewnętrznie do reprezentowania pozycji w hierarchii.
Używanie danych XML typu może być przełożonego, gdy są spełnione wszystkie następujące:
Zakończenie hierarchii zawsze przechowywania i pobierania.
Dane są zużywane w formacie XML przez aplikację.
Predykat przeszukuje są bardzo ograniczony i nie wydajność krytycznych.
Na przykład jeśli aplikacji śledzi wielu organizacjach, zawsze przechowuje i pobiera pełną hierarchii organizacyjnej, a nie kwerendy do jednej organizacji, tabela następujący formularz przynieść:
CREATE TABLE XMLOrg
(
Orgid int,
Orgdata xml
) ;
GO
Migrowanie z nadrzędnych i podrzędnych do hierarchyid
Większość drzew są reprezentowane dzisiaj nadrzędny i podrzędny.Najprostszym sposobem migracji ze struktury nadrzędny i podrzędny do tabela za pomocą hierarchyid, jest użycie tymczasową kolumnę lub tabela tymczasowa do śledzenia liczby węzłów na każdym poziomie hierarchii.Przykład tabela nadrzędnej i podrzędnej migracja Zobacz Lekcja 1 z Samouczek: Za pomocą hierarchyid, typ danych.
Transformacje kwerendy dla hierarchyid
Aby zmaksymalizować wydajność kwerend hierarchie, SQL Server automatycznie wykonuje trzy przekształcenia kwerend obejmujących hierarchyid.Wynik Transformacje te są widoczne w wyniku plan wykonania przekształconych kwerend.
GetAncestor jest przekształcana do skanowania zakres i pozostałości predykatu
**GetAncestor(n)**daje nth element nadrzędny węzła.Jest to przydatne, gdy potrzebna jest dokładne relacji (nadrzędne, podrzędność, pokolenia itp.) między dwoma węzłami, w przeciwieństwie do bardziej ogólnym IsDescendantOf.
Na przykład wykonać następującej kwerendy, aby znaleźć wszystkich pracowników, których bezpośrednich Menedżer jest @value:
DECLARE @value hierarchyid ;
SELECT * FROM AdventureWorks2008R2.HumanResources.Employee
WHERE OrganizationNode.IsDescendantOf(@value) = 1;