Udostępnij za pośrednictwem


Używanie typów danych hierarchyid (aparat bazy danych)

The hierarchyid data type is system-provided.Użycie hierarchyid jako typ danych do tworzenia tabel z hierarchiczną strukturą lub odwołać hierarchicznej struktury danych w innej lokalizacji.Użycie Funkcje hierarchyid wyszukiwania i wykonywania pracy z danymi hierarchiczne przy użyciu Transact-SQL.

Hierarchiczna danych jest definiowana jako zestaw elementów danych, które są powiązane ze sobą relacje hierarchiczne.Relacje hierarchiczne to, gdzie jeden element danych jest elementem nadrzędnym innego elementu.Hierarchiczna dane są często w bazach danych.Następujące przykłady:

  • Struktury organizacyjnej

  • System plików

  • Zestaw zadań w projekcie

  • Taksonomia języka terminów

  • Na wykresie łącza między stronami sieci Web

New in SQL Server 2008, the hierarchyid type makes it easier to store and query hierarchical data.hierarchyid is optimized for representing trees, which are the most common type of hierarchical data.

Klucz właściwości hierarchyid

Wartość hierarchyid Typ danych reprezentuje pozycji w hierarchii drzewa. Wartości dla hierarchyid mają następujące właściwości:

  • backup_source_directory

    Średnia liczba bitów, które są wymagane do reprezentowania węzła w drzewie z n węzłów zależy od fanout średnią (średnią liczbę elementów podrzędnych węzła).Dla małych fanouts, (0-7) rozmiar wynosi około 6 * dziennikaA n bitów, w przypadku, gdy A jest średnia fanout.copy_job_idrestore_job_id

  • monitor_server

    Given two hierarchyid values a and b, a<b means a comes before b in a depth-first traversal of the tree.Indeksy na hierarchyid typy danych są w porządku pierwsze głębokość i węzłów zbliżone do siebie na przechodzenie zaczynających się od głębokości znajdują się blisko siebie. last_copied_file

  • last_copied_date

    Za pomocą metody GetDescendant zawsze można wygenerować element równorzędny na prawo od dowolnego węzła, na lewo od dowolnego węzła lub między dowolnymi dwoma elementami równorzędnymi.Właściwość porównania jest zachowywana w przypadku wstawienia dowolnej liczby węzłów do hierarchii lub usunięcia ich z niej.W przypadku większości operacji wstawiania i usuwania jest zachowywana właściwość kompaktowości.Jednak operacje wstawiania między dwoma węzłami generują wartości hierarchyid o nieco mniej kompaktowej reprezentacji.

Ograniczenia hierarchyid

The hierarchyid data type has the following limitations:

  • Kolumna typu hierarchyid nie reprezentuje automatycznie drzewa. Jest on do aplikacji do generowania i przypisywania hierarchyid wartości w taki sposób, że żądaną relację między wierszami są odzwierciedlane w wartości. Niektóre aplikacje nie nawet warto mieć kolumna typu hierarchyid stanowić drzewo. Być może wartości są odwołaniami do lokalizacji w hierarchii zdefiniowany w innej tabela.

  • Jest on do aplikacji do zarządzania współbieżność generowania i przypisywania hierarchyid wartości. Nie ma żadnej gwarancji, że hierarchyid wartości kolumna są unikatowe, chyba że aplikacja używa unikatowego ograniczenia na klucz lub Wymusza unikatowość się za pomocą własnej logikę.

  • Relacje hierarchiczne, reprezentowane przez hierarchyid wartości nie są wymuszane jak relacja klucz obcy. Jest to możliwe i niekiedy odpowiednie do hierarchicznej relacji gdzie A ma element podrzędność B, a następnie A zostanie usunięty, pozostawiając B w relacji do nieistniejącego rekordu.Jeśli to zachowanie jest nie do przyjęcia, aplikacja musi kwerendy dla obiektów podrzędnych przed usunięciem elementów nadrzędnych.

Strategie indeksowania

Istnieją dwa strategii dla indeksowania hierarchicznych danych:

  • Głębokość — pierwszy

    Indeks pierwszego głębokość, wiersze znajdujące się w poddrzewie znajdują się blisko siebie.Na przykład wszystkich pracowników, którzy raportu za pomocą Menedżera znajdują się w pobliżu rekordu ich menedżerów.

Nodes are stored together.

  • Szerokość pierwszej

    Szerokość pierwszej przechowuje wierszy każdego poziom hierarchii razem.Na przykład rekordy pracowników, którzy raport bezpośrednio do tego samego menedżera znajdują się blisko siebie.

Each hierarchy level is stored together.

Przykłady

The GetLevel() metoda can be used to create a breadth first ordering. W poniższym przykładzie tworzone są indeksy pierwszego szerokość i głębokość pierwszy:

USE AdventureWorks ; 
GO

CREATE TABLE Organization
   (
    EmployeeID hierarchyid,
    OrgLevel as EmployeeID.GetLevel(), 
    EmployeeName nvarchar(50) NOT NULL
   ) ;
GO

Indeks pierwszego głębokość co-located są wszystkie węzły w poddrzewie węzła.Indeksy zaczynających się od głębokości w związku z tym są skuteczne dla odpowiedzi na kwerendy dotyczące poddrzewa, takie jak "ZnajdY wszystkie pliki w tym folderze i jego podfolderów".

CREATE CLUSTERED INDEX Org_Breadth_First 
ON Organization(OrgLevel,EmployeeID) ;
GO

CREATE UNIQUE INDEX Org_Depth_First 
ON Organization(EmployeeID) ;
GO

Indeks pierwszego szerokość co-located są wszystkie bezpośrednie elementy podrzędne węzła.Szerokość pierwszej indeksy w związku z tym są skuteczne dla odpowiedzi na kwerendy dotyczące bezpośrednie elementy podrzędne, takie jak "" szukanie wszystkich pracowników, którzy podlegają bezpośrednio ten Menedżer".

Czy do pierwszego głębokość, pierwszy szerokość, lub obu i złożenie klastrowania klucz (jeśli istnieje), zależy od względną ważnością powyższych typów kwerend i względną ważnością SELECT w stosunku do.Operacje DML.Na przykład szczegółowe strategii indeksowania zobacz Tutorial: Using the hierarchyid Data Type.

Kiedy Użyj rozwiązania alternatywne w stosunku do hierarchyid

Dwa rozwiązania alternatywne w stosunku do hierarchyid w przypadku reprezentujący hierarchiczną danych są:

  • Nadrzędny/podrzędność

  • XML

hierarchyid jest zwykle nadrzędne w stosunku do tych alternatyw.Istnieją jednak szczególnych sytuacjach wyszczególnione poniżej których prawdopodobnie przełożonego alternatyw.

Nadrzędny/podrzędność

W przypadku korzystania z metody nadrzędny/podrzędność, każdy wiersz zawiera odwołanie do obiektu nadrzędnego.W poniższej tabela zdefiniowano typowe tabela zawiera element nadrzędny i wierszy podrzędność w relacji typu nadrzędny/podrzędność:

USE AdventureWorks ;
GO

CREATE TABLE ParentChildOrg
   (
    EmployeeID int PRIMARY KEY,
    ManagerId int REFERENCES ParentChildOrg(EmployeeID),
    EmployeeName nvarchar(50) 
   ) ;
GO

Porównywanie nadrzędny/podrzędność i hierarchyid Wspólne działania

  • Kwerendy poddrzewa są znacznie szybsze z hierarchyid.

  • Bezpośrednich elementów podrzędnych kwerendy 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 tej samej złożoności z hierarchyid.

Nadrzędny/podrzędność może być przełożonego, gdy następujące warunki:

  • Rozmiar klucz to bardzo krytycznych.Dla tego samego numeru węzły hierarchyid wartość jest równa lub większa niż (liczba całkowita rodzinysmallint, int, bigint) wartość. Dzieje się tak tylko dlatego do używania nadrzędny/podrzędność w rzadkich przypadkach hierarchyid ma znacznie lepszą miejscowości złożoności We/Wy i PROCESORA, niż to konieczne typowych wyrażeń tabela przy użyciu programu struktury nadrzędny/podrzędność.

  • Wykonuje kwerendę rzadko kwerendy między sekcjami w hierarchii.Innymi słowy, jeśli kwerendy zazwyczaj adres pojedynczego punktu w hierarchii.W takich przypadkach kolokacji nie jest ważna.Na przykład nadrzędny/podrzędność jest przełożonego, jeśli tabela organizacji jest używane tylko dla systemem listy płac dla poszczególnych pracowników.

  • Typu nie liść poddrzewa Przenieś często i wydajność jest bardzo ważne.W reprezentacji nadrzędny/podrzędność, zmiany lokalizacji dla wiersza w hierarchii ma wpływ na jeden wiersz.Zmienianie lokalizacji dla wiersza w hierarchyid ma wpływ na sposób użycia n wierszy, na którym n jest liczba węzłów w poddrzewa, w trakcie przenoszenia.

    Jeśli tego typu nie liść poddrzewa przenieść często i wydajność jest bardzo ważne, ale większość ruchu na dobrze poziomie w hierarchii, należy rozważyć rozdzielenie wyższych i niższych poziomów na dwóch hierarchii.Dzięki temu wszystkie ruchy na poziomie liść wyższej hierarchii.Na przykład należy rozważyć hierarchię witryn sieci Web obsługiwanych przez usługa.Witryny zawierają wiele stron uporządkowanych w sposób hierarchiczny.Witryn obsługiwanych może być przenoszone do innych lokalizacji w hierarchii witryn, ale podrzędny strony są rzadko re-arranged.Może być reprezentowany przez:

    CREATE TABLE HostedSites 
       (
        SiteId hierarchyid, PageId hierarchyid
       ) ;
    GO
    

XML

Dokument XML jest drzewo, a w związku z tym pojedyncze wystąpienie typu danych XML może reprezentować pełną hierarchii.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 czynności:

  • Zakończenie hierarchii jest zawsze przechowywane i pobierane.

  • Dane są zużywane w formacie XML przez aplikację.

  • Predykat wyszukiwane są bardzo ograniczona i nie wydajność krytycznych.

Na przykład jeśli aplikacja śledzi wiele organizacji, zawsze przechowuje i pobiera pełną hierarchii organizacyjnej, a nie kwerendę w poszczególnych organizacjach, tabela następujący formularz może być sensu:

CREATE TABLE XMLOrg 
    (
    Orgid int,
    Orgdata xml
    ) ;
GO

Migrowanie z nadrzędny/podrzędność do hierarchyid

Większość drzewa są reprezentowane dzisiaj za pomocą nadrzędny/podrzędność.Najprostszym sposobem migracji z struktury nadrzędny/podrzędność do tabeli za pomocą hierarchyid, polega na użyciu tymczasową kolumna lub tabela tymczasowa do śledzenia liczby węzłów na każdym poziomie hierarchii. Przykład nadrzędny/podrzędność tabela migracji można znaleźć w temacie Lekcja 1 z Tutorial: Using the hierarchyid Data Type.

Przekształcenia kwerendy dla hierarchyid

Aby zmaksymalizować wydajność podczas badania hierarchii, SQL Server automatycznie wykonuje trzy przekształcenia kwerend obejmujących hierarchyid. Wynik Transformacje te są widoczne w danych wyjściowych plan wykonania przekształconych kwerend.

IsDescendantOf jest przekształcana zakres wyszukiwania

Biorąc pod uwagę E kolumna albo zmienną, E.IsDescendantOf(c) przekształceniu wyszukiwania zakres. Znacznie zmniejsza koszty znajdowanie elementów podrzędnych.Jeśli na nie ma indeksu pierwszego głębokość c, pomaga tej transformacja, ponieważ wszystkie elementy podrzędne E są co-located. Na przykład wstawki kodu programu @value.IsDescendantOf(EmployeeId) jest wykonywane jako EmployeeId >= @Value AND EmployeeId <= @Value.DescendantLimit(). DescendantLimit jest metodą wewnętrznych, określające, co najmniej górną granicę wszystkie możliwe obiekty podrzędne węzła.Zwróć uwagę, że @value nie musi być parametrem. Może to być kolumną, być może z warunek łączyć.

GetAncestor jest przekształcany do skanowania zakres i pozostałych predykatu

GetAncestor(n) daje nth element nadrzędny węzła.Jest to przydatne wtedy, gdy potrzebna jest dokładne relacji (nadrzędne, podrzędność, nadrzędnego itp.) między dwoma węzłami, w przeciwieństwie do kilku ogólne IsDescendantOf.

Na przykład wykonaj następującą kwerendę w celu znalezienia wszystkich pracowników, których bezpośredni kierownik jest @value:

SELECT * FROM Employees WHERE EmployeeId.GetAncestor(1) = @value

To jest przekształcany do skanowania zakres dla obiektów podrzędnych @value, z oryginalnym predykat jako resztkowego. Kod jest przekształcane w następujących czynności:

SELECT * FROM Employees 
WHERE 
   EmployeeId >= @Value AND EmployeeId <= @value.DescendantLimit() 
   AND EmployeeId.GetAncestor(1) = @value

Efekt tego jest ograniczenie skanowania do poddrzewa z @value.

GetAncestor jest przekształcana na wyszukiwanie indeksu, korzystając z szerokość pierwszej indeks

W kwerendzie powyżej Jeśli @value jest w wyższych poziomów drzewa optymalizacji powyżej nie znacznie zmniejsza liczbę wierszy skanowania. Podczas pytania — informacje nth nadrzędnego są typowe, aplikacje należy utworzyć szerokość pierwszej indeks jak to zostało wcześniej opisane.

Jeśli obecna jest wartość indeksu pierwszego szerokość, powyżej kwerendy dalej jest przekształcany do następującego:

SELECT * FROM Employees 
WHERE 
   EmployeeId >=@value AND EmployeeId <= @Value.DescendantLimit() 
   AND @value.GetLevel()+1 = EmployeeId.GetLevel()

Ostatni wiersz (zawierające GetLevel metody) staje się indeksu wyszukiwania w szerokości pierwszej index. Jeśli EmployeeId jest kluczem klastrowania, a następnie jest drugą kolumna do indeksu pierwszego szerokość i dwa predykaty stają się indeksu wyszukiwania, która określa dokładnie n co-located bezpośrednich podwładnych z @value.

The GetAncestor transforms are not limited to queries for direct parents.Argument GetAncestor może być wszelkie zmienne czy stała.