Share via


Hierarchyid veri türleri (Veritabanı Altyapısı) kullanma

The hierarchyid data type is system-provided.Kullanımıhierarchyid hiyerarşik bir yapı ile tablo oluşturmak için veya başka bir konuma verileri hiyerarşik yapısını başvurmak için bir veri türü Kullanımıhierarchyid işlevleri sorgulamak ve kullanarak hiyerarşik verileri iş yapmak için Transact-SQL.

Hiyerarşik verileri olarak tanımlanmış bir küme birbirlerine hiyerarşik ilişkileri ile ilgili veri öğelerinin.Bir veri öğesi başka bir öğeyi üst olduğu hiyerarşik ilişkileri var.Hiyerarşik verileri veritabanlarında yaygındır.Aşağıdaki örnekler verilebilir::

  • Bir organizasyon yapısı

  • Bir dosya sistemi

  • Projedeki görevleri kümesi

  • Bir taksonomi dil koşulları

  • Bir grafiği Web sayfaları arasında bağlantılar

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.

Hierarchyid, anahtar özellikler

Değeri,hierarchyidveri türünü temsil eden bir konuma bir ağaç hiyerarşisinde.Değerlerihierarchyidaşağıdaki özelliklere sahiptir:

  • Son derece düzenleme

    Bit ile ağacındaki bir düğümü temsil etmek için gerekli olan ortalama sayısın düğümleri bağlıdır (alt düğümün ortalama sayı) ortalama fanout.Boyutu yaklaşık 6 büyük küçük fanouts, (0-7) için * günlükA n bitlik bir yerde ortalama fanout. Yaklaşık 38 bit hiyerarşide bir kuruluş 100.000 kişi ortalama bir fanout 6 düzeyinden bir düğümü alır.Bu 40 bit ya da depolama için 5 bayt olarak yuvarlanır.

  • Karşılaştırma derinlik ilk sırada olan

    Verilen ikihierarchyiddeğerleria, bbir <b gelir bir ağaç. bir derinlik ilk geçişi b önce gelir DizinlerdehierarchyidDerinlik ilk sırada olan veri türleri ve derinlik ilk geçişi yakın için düğümler birbirine yakın bir yerde depolanır.Örneğin, bir kaydın alt kaydı bitişik depolanır.

  • Rasgele eklemeler ve silmeler için destek

    KullanarakGetDescendant yöntem, her zaman belirtilen bir düğüm sağındaki herhangi iki eşi. arasında veya belirli bir düğümün soluna bir eş oluşturmak mümkündür Rasgele bir düğüm sayısı eklendiğinde veya hiyerarşi silinmiş karşılaştırma özellik korunur.Birçok eklemeler ve silmeler compactness özelliğini korur.Ancak iki düğüm arasında eklemeler hierarchyid değerleri biraz daha az bir CD ile oluşturacak gösterimi.

Hierarchyid sınırlamaları

The hierarchyid data type has the following limitations:

  • Sütun türühierarchyidotomatik olarak gösteren bir ağaç.Olduğu kadar uygulama oluşturmak ve atamak içinhierarchyidşekilde satırlar arasında istediğiniz ilişki değerlerini. değişiklikler değerBazı uygulamalar bile isteyebilirsiniz sahip bir sütun türühierarchyidtemsil eden bir ağaç.Belki de başka bir tabloda tanımlı bir hiyerarşi içinde bir konuma başvuruları değerlerdir.

  • Olduğu kadar uygulama oluşturma ve atama eşzamanlılık yönetmekhierarchyiddeğerleri.Garanti,hierarchyidbir sütundaki değerleri benzersiz sürece uygulama zorlar kendisi ile benzersiz veya benzersiz bir anahtar kısıtlaması kullanır kendi mantığı.

  • Hiyerarşik ilişkileri tarafından temsilhierarchyiddeğerleri yok gibi zorunlu bir yabancı anahtar ilişkisi.Bu, olası ve burada A, B alt vardır ve A B ile bir ilişkisi varolmayan bir kayıt için bırakma silinir hiyerarşik bir ilişki bazen uygun olur.Bu davranış, kabul edilemez ise, uygulama için alt öğelerin üst silmeden önce sorgulamalısınız.

Dizin oluşturma stratejileri

Sıradüzensel veri dizini oluşturmak için iki strateji vardır:

  • Derinlik ilk

    Derinlik ilk dizin, bir alt satırda birbirine yakın bir yerde depolanır.Örneğin, bir Yöneticisi ile rapor tüm çalışanlar yöneticilerinin kaydı saklanır.

Nodes are stored together.

  • Etki derecesini ilk

    Bir etki derecesini ilk satırları hiyerarşisinin her düzeyinde birlikte saklar.Örneğin, aynı yöneticiye doğrudan rapor çalışanları birbirine yakın bir yerde depolanır.

Each hierarchy level is stored together.

Örnekler

The GetLevel() method can be used to create a breadth first ordering.Aşağıdaki örnekte, etki derecesini ilk hem derinlik ilk dizin oluşturulur:

USE AdventureWorks ; 
GO

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

Bir derinlik ilk dizinde bir düğümün alt ağaçtaki tüm düğümleri co-located var.Derinlik ilk dizin alt ağaç gibi "tüm dosyaları bu klasör ve alt klasörleri Bul" hakkındaki sorguları yanıtlamak için bu nedenle verimlidir.

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

CREATE UNIQUE INDEX Org_Depth_First 
ON Organization(EmployeeID) ;
GO

Bir etki derecesini ilk dizini tüm doğrudan alt düğümün co-located.Dizin etki derecesini ilk Bul"Bu yöneticisine doğrudan rapor tüm çalışanlar gibi" hemen alt hakkındaki sorguları yanıtlamak için bu nedenle verimlidir.

Derinlik ilk etki derecesini birinci, ya da her ikisini de ve küme anahtar (varsa) sağlamak için için yukarıdaki sorgu türleri göreli önemini ve SELECT ve göreli önemini bağlıdır olup olmadığını.DML işlemleri.Dizin oluşturma stratejileri, ayrıntılı bir örneği için bkz:Öğretici: Veri türü hierarchyid kullanma.

Ne zaman hierarchyid için kullanım seçenekleri

İki alternatifhierarchyidhiyerarşik verileri temsil eden için olan:

  • Üst/alt

  • XML

hierarchyid Bu alternatif genellikle üstündedir.Ancak, diğer olası üst olduğu aşağıda ayrıntılı özel durumlar vardır.

Üst/alt

Üst/alt yaklaşımı kullanarak, her satır için üst başvuru içerir.Aşağıdaki tablo, üst ve alt satır üst/alt ilişkisi için kullanılan genel bir tablo tanımlar:

USE AdventureWorks ;
GO

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

Üst/alt karşılaştırma vehierarchyidGenel işlemler için

  • Alt sorgular olduğundan çok daha hızlı olanhierarchyid.

  • Doğrudan alt sorgular ile biraz daha yavaş gerçekleşiyorhierarchyid.

  • Yaprak olmayan düğümlere taşıma daha yavaş olanhierarchyid.Yaprak olmayan düğüm ekleme ekleme ve taşıma yaprak düğümlerin aynı kapsamına sahip olanhierarchyid.

Aşağıdaki koşulların, üst/alt üst olabilir:

  • Anahtar boyutu çok önemlidir.Düğüm sayısı için birhierarchyiddeğerdir eşit veya büyük bir tamsayı ailesi ( smallint, int, bigint) değeri.Bu, yalnızca ender durumlarda, üst/alt kullanmak için bir nedenhierarchyidgerekli olduğunda kullandığınız genel tablo ifadeleri çok g/Ç ve CPU karmaşık, çok daha iyi konum vardır. bir ana/alt yapısı.

  • Nadiren hiyerarşisinin bölümlerde sorgu sorgular.Diğer bir deyişle, sorgu yalnızca tek bir noktadan hiyerarşisinde genellikle adres.Bu gibi durumlarda co-location önemli değildir.Örneğin, üst/alt kuruluş tablonun yalnızca tek tek çalışanlar için bordro çalıştırmak için kullanılıyorsa üstündedir.

  • Non-yaprak alt ağaçların sık taşıyın ve performansı çok önemlidir.Üst/alt gösterimi bir hiyerarşi içinde bir satırın konumunu değiştirme, tek bir satır etkiler.Bir satırın konumunu değiştirme birhierarchyidkullanım etkilernn sayı olduğu satır, taşınan alt düğümler.

    Bu sık sık Yaprak olmayan alt ağacı hareket ve performans çok önemlidir, ancak gider en iyi tanımlanmış bir hiyerarşi düzeyinde olan, alt ve üst düzey iki hiyerarşileri bölmeyi düşünün.Bu yüksek sıradüzenin yaprak düzeyleri ile tüm hamle yapar.Örneğin, bir hizmet tarafından barındırılan Web sitelerini hiyerarşisini göz önünde bulundurun.Birden çok sayfa hiyerarşik bir biçimde düzenlenmiş siteleri içerir.Barındırılan siteler için site hiyerarşisindeki başka konumlara taşınmış olabilir, ancak alt sayfalarıdır nadiren re-arranged.Bu aracılığıyla temsil edilmesi:

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

XML

Bir ağaç bir XML belgesidir ve bu nedenle, tam bir hiyerarşisi tek bir XML veri türünün örnek gösterebilir.InSQL ServerXML dizin oluşturulurhierarchyiddeğerler konumu göstermek için dahili olarak kullanılır hiyerarşisi.

Tüm aşağıdakiler doğruysa XML verilerini kullanmak tür üstün olabilir:

  • Tam hiyerarşi her zaman saklı alınan ve.

  • Verileri XML biçiminde uygulama tarafından tüketilen.

  • Öğeler son derece sınırlı ve değil önemli olan performans karşılaştırma arar.

Örneğin, uygulamanın birden çok kuruluş izler, her zaman depolar ve tüm organizasyon hiyerarşisine alır ve tek bir kuruluş içinde sorgu, tablo aşağıdaki biçimde anlamlı:

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

Hierarchyid için üst/alt geçiş yapma

Çoğu ağaçları, üst/alt bugün kullanılarak temsil edilir.Geçiş tablosunu kullanmanın bir üst/alt yapısından için en kolay yoluhierarchyidgeçici bir sütun ya da her düzeyde hiyerarşi. düğüm sayısını izlemek için geçici tablo kullanmak.Örnek olarak, üst/alt tablo, geçiş için 1. Ders, bkz:Öğretici: Veri türü hierarchyid kullanma.

Hierarchyid için sorgu dönüşümleri

Sorgulama hiyerarşileri performansını en üst düzeye çıkarmak içinSQL Serverotomatik olarak üç dönüştürmeleri ilgili sorguları gerçekleştirir.hierarchyid.Bu dönüşümler sonucu gösterim planı çıktı dönüştürülmüş sorguları için görülebilir.

IsDescendantOf için bir aralık arama dönüştürüldükten

VerilenEbir sütun veya bir değişken olarak E.IsDescendantOf(c)aralık arama dönüştürülmüş.Bu bulma altlarý maliyetini önemli ölçüde azaltır.Yoksa yoktur bir derinlik ilk dizinc, çünkü bu dönüştürme yardımcı, tüm alt öğelerinEco-located.Örneğin, kod parçacığı@value.IsDescendantOf(EmployeeId)olarak yürütüldüğündeEmployeeId >= @Value AND EmployeeId <= @Value.DescendantLimit().DescendantLimit en üst sınır olan bir düğümün tüm olası alt öğelerin belirleyen bir iç yöntemidir.Fark@valuesahip değil olacak bir parametre.Bir sütun, belki de birleştirmek koşulu olabilir.

GetAncestor, aralık tarama ve kalan karşılaştırma için dönüştürme

GetAncestor(n)verennbir düğüm. th üst Bu yararlı iki düğüm arasında doğru ilişkiyi (üst, alt, grandparent, vb.) gerekiyor, daha fazla genel farklı olarakIsDescendantOf.

Örneğin, tüm çalışanların, doğrudan Yöneticisi bulmak için aşağıdaki sorguyu yürütmek@value:

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

Bu altlarý için bir aralık tarama uygulamasına dönüştürülmüş@value, residual. özgün karşılaştırma ileKod içinde aşağıdaki dönüştürülür:

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

Bunun etkisi olduğu için tarama için alt sınırı@value.

GetAncestor etki derecesini ilk dizini kullanarak bir dizin araması dönüştürüldükten

Yukarıdaki sorguda,@valueolan ağacın üst düzeyde en iyileştirme yukarıdaki taranan satır sayısı önemli ölçüde azaltmaz., Hakkında sorularnth üst ortak, uygulamalar bir etki derecesini-ilk-daha önce açıklandığı gibi dizin oluşturun.

Bir etki derecesini ilk dizin varsa, yukarıdaki sorgu daha aşağıdaki dönüştürüldükten:

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

Son satır (içeren GetLevelyöntemleri) bir dizin arama etki derecesini - ilk - dizin. olurIfEmployeeIdKüme anahtar ise, ikinci sütundaki etki derecesini ilk dizin olduğu ve iki koşullarına tam olarak belirten bir dizin araması halinenco-located doğrudan raporları@value.

The GetAncestor transforms are not limited to queries for direct parents.BağımsızGetAncestorherhangi bir değişken veya olabilir sabit.