父/子
使用父/子方法時,每一行都包含對父級的引用。下表定義了一個用于在父/子關(guān)系中包含父行和子行的典型表:
|
|
---|---|
USE AdventureWorks2008R2 ; GO CREATE TABLE ParentChildOrg ???( ????BusinessEntityID int PRIMARY KEY, ????ManagerId int REFERENCES ParentChildOrg(BusinessEntityID), ????EmployeeName nvarchar(50) ???) ; GO |
針對一些常見操作比較父/子與 hierarchyid
-
使用
hierarchyid
進行子樹查詢時速度明顯加快。
-
使用
hierarchyid
進行直接后代查詢時速度稍慢。
-
使用
hierarchyid
移動非葉節(jié)點時速度明顯減慢。使用
hierarchyid
插入非葉節(jié)點和插入或移動葉節(jié)點具有相同的復(fù)雜度。
當存在以下情況時,使用父/子可能更好:
-
鍵的大小非常重要。在節(jié)點數(shù)相同的情況下,
hierarchyid
值等于或大于整型系列(
smallint
、
int
、
bigint
)的值。這只是在很少情況下使用父/子的一個原因,因為
hierarchyid
在 I/O 局部實用性和 CPU 復(fù)雜性方面明顯優(yōu)于使用父/子結(jié)構(gòu)時所需的公用表表達式。
-
很少跨層次結(jié)構(gòu)的不同部分執(zhí)行查詢。也就是說,是否通常僅對層次結(jié)構(gòu)中的單個點進行查詢。在這些情況下,存儲在一起并不重要。例如,如果組織表僅用于為各個雇員運行工資單,則使用父/子更好。
-
非葉子樹移動頻繁并且性能非常重要。在父/子表示形式中,更改層次結(jié)構(gòu)中行的位置將影響單個行。使用
hierarchyid
時,更改行的位置將影響
n
行,其中
n
是要移動的子樹中的節(jié)點數(shù)。
如果這種非葉子樹移動頻繁并且性能非常重要,但多數(shù)移動操作都是在比較明確的層次結(jié)構(gòu)級別上進行的,請考慮將較高和較低的級別拆分成兩個層次結(jié)構(gòu)。這樣,所有的移動操作都是移到較高層次結(jié)構(gòu)的葉級。例如,假設(shè)有一個由服務(wù)承載的網(wǎng)站的層次結(jié)構(gòu)。各網(wǎng)站包含許多以分層方式排列的頁面。承載的網(wǎng)站可能移動到網(wǎng)站層次結(jié)構(gòu)中的其他位置,但是從屬的頁面很少會重新排列。這種情況可表示如下:
復(fù)制代碼
CREATE TABLE HostedSites ???( ????SiteId hierarchyid, PageId hierarchyid ???) ; GO
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
