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

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