父/子
使用父/子方法时,每一行都包含对父级的引用。下表定义了一个用于在父/子关系中包含父行和子行的典型表:
USE AdventureWorks2008R2 ; GO CREATE TABLE ParentChildOrg ( BusinessEntityID int PRIMARY KEY, ManagerId int REFERENCES ParentChildOrg(BusinessEntityID), EmployeeName nvarchar(50) ) ; GO |
针对一些常见操作比较父/子与 hierarchyid
- 使用 hierarchyid 进行子树查询时速度明显加快。
- 使用 hierarchyid 进行直接后代查询时速度稍慢。
- 使用 hierarchyid 移动非叶节点时速度明显减慢。使用 hierarchyid
插入非叶节点和插入或移动叶节点具有相同的复杂度。
当存在以下情况时,使用父/子可能更好:
- 键的大小非常重要。在节点数相同的情况下,hierarchyid
值等于或大于整型系列(smallint、int、bigint)的值。这只是在很少情况下使用父/子的一个原因,因为
hierarchyid 在 I/O 局部实用性和 CPU 复杂性方面明显优于使用父/子结构时所需的公用表表达式。
- 很少跨层次结构的不同部分执行查询。也就是说,是否通常仅对层次结构中的单个点进行查询。在这些情况下,存储在一起并不重要。例如,如果组织表仅用于为各个雇员运行工资单,则使用父/子更好。
- 非叶子树移动频繁并且性能非常重要。在父/子表示形式中,更改层次结构中行的位置将影响单个行。使用 hierarchyid
时,更改行的位置将影响 n 行,其中 n
是要移动的子树中的节点数。
如果这种非叶子树移动频繁并且性能非常重要,但多数移动操作都是在比较明确的层次结构级别上进行的,请考虑将较高和较低的级别拆分成两个层次结构。这样,所有的移动操作都是移到较高层次结构的叶级。例如,假设有一个由服务承载的网站的层次结构。各网站包含许多以分层方式排列的页面。承载的网站可能移动到网站层次结构中的其他位置,但是从属的页面很少会重新排列。这种情况可表示如下:
复制代码
CREATE TABLE HostedSites ( SiteId hierarchyid, PageId hierarchyid ) ; GO
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现