是否有人在实际生产中使用 HierarchyId 并使用合理大小的表格,超过几千行?它可靠/高效吗?到目前为止,我还没有发现任何不隶属于供应商的人推荐它,Paul Nielsen在这里建议不要这样做。
您在实际生产系统中使用 HierarchyId 有何经验?
当您选择 HierarchyId 而不是其替代方案时,您使用了哪些标准?
是否有人在实际生产中使用 HierarchyId 并使用合理大小的表格,超过几千行?它可靠/高效吗?到目前为止,我还没有发现任何不隶属于供应商的人推荐它,Paul Nielsen在这里建议不要这样做。
您在实际生产系统中使用 HierarchyId 有何经验?
当您选择 HierarchyId 而不是其替代方案时,您使用了哪些标准?
我已经实现了 HierarchyID 并发现它提供了良好的性能和易于使用。
我在相对较小的数据集(数万行)上使用了它,层次结构深度可达 10 个分支。
为什么要使用它?HierarchyID 类型提供了许多帮助方法(例如
IsDescendantOf
),它们使您的工作比滚动您自己的物化路径更容易。Paul Nielsen 对 StackOverflow 的评论让我感到困惑 - HierarchyID是一个物化路径。我更倾向于同意他回答下面的评论。
一个更好的问题可能是“为什么不使用它”。它易于使用,提供了许多您自己编写的功能,并且性能良好(在我有限的测试中)。
这是对 Kirk 的问题“为什么不使用它 (HierarchyId)”的回答。与物化路径相比,在某些重要情况下,HierarchyId 似乎性能较差且使用起来不太方便。
原因很简单:引用Microsoft 对 Connect 的评论,“问题在于 CLR 调用,包括 hierarchyID 的方法,对查询优化器来说是不透明的。这是设计使然。但是,这意味着它们的基数估计有时可能相当错误的。”
另一方面,实现物化路径在我们第一次需要时非常容易,而下一次它本质上是一个复制粘贴任务。因此,我们只需付出很少的努力即可获得更通用、性能更好的解决方案。
所以我完全同意 Paul Nielsen 的观点,他在其名为“Microsoft® SQL Server® 2008 圣经”的优秀著作中写道:“新的 HierarchyID 并非没有争议。它是新的并且有大量的新闻和演示时间,但我我不确定这是一个需要其他解决方案的问题。”
我公司在直销、多层次营销软件中使用 HeirachyID。有用。我还没有真正用它做过任何工作,我只知道我们正在使用它。
我看到的最大问题是我们以循环方式遍历关卡,而不是更多地基于集合。在那个领域,它对我们来说表现并不好,但我不确定这是否是类型或我们实现它的问题。
hierarchyid 的一个问题是您获得了供应商锁定。但我确实找到了 Adam Milazzo 的一篇很棒的文章,内容是关于内部一切是如何运作的:
http://www.adammil.net/blog/view.php?id=100
有了这个,我可以编写一个 Postgres 脚本来从 MSSQL 转换我的数据集。还将它包含在我编写的将 AdventureWorks 数据库导入 Postgres 的脚本中:
https://github.com/lorint/AdventureWorks-for-Postgres
只需在 install.sql 文件中搜索“hierarchyid”,您很快就会找到转换它的参考。
我们团队已经在生产中实现了,一开始性能不错,2年后,表现在有43万行,getroot和getdecendent需要3秒,都是计算下一个插入记录的Id值。现在单个子树插入大约需要 16 秒,这根本不可接受。