MS SQL Server中分层ID值的高效管理

MS SQL Server中分层ID值的高效管理,sql,sql-server,optimization,hierarchyid,Sql,Sql Server,Optimization,Hierarchyid,对于SQL Server 2008及以后版本中的hierarchyid数据类型,尝试优化下一个子元素/1/1/8/[/1/1/8/x/]的发布是否有任何好处,以便x是最接近1的非负整数 一个简单的解决方案似乎是找到最大分配的子值,并使兄弟姐妹正确,但似乎你最终会耗尽这一点(理论上,如果不是在实践中),因为你从来没有回收任何价值观,据我理解,消极和非整体会消耗更多的空间 示例:如果我有一位拥有这些子项的家长(子项的顺序无关紧要,可以重新分配值): 我不希望下一个孩子有/1/1/8/2/?事情是这样

对于SQL Server 2008及以后版本中的hierarchyid数据类型,尝试优化下一个子元素/1/1/8/[/1/1/8/x/]的发布是否有任何好处,以便x是最接近1的非负整数

一个简单的解决方案似乎是找到最大分配的子值,并使兄弟姐妹正确,但似乎你最终会耗尽这一点(理论上,如果不是在实践中),因为你从来没有回收任何价值观,据我理解,消极和非整体会消耗更多的空间

示例:如果我有一位拥有这些子项的家长(子项的顺序无关紧要,可以重新分配值):

我不希望下一个孩子有
/1/1/8/2/

事情是这样的

你所说的“最优”并不一定是最优的

在将值插入层次结构时,我通常不关心特定节点的子节点的顺序

如果我这样做了,这就是为什么GetDegenant中有两个参数

如果我想将节点预先添加到顺序中(即,使其成为第一个),我将使用NULL的第一个参数和其他子节点的最小值的第二个参数

如果我想将节点追加到顺序中(即最后一个),我将使用其他子节点最大值的第一个参数和NULL的第二个参数

如果要在其他两个子节点之间插入,则需要插入的节点之前和之后的一个子节点

在任何情况下,hierarchy字段中的值通常并不重要,因为您将按不同的字段(如名称或其他)排序

因此,将内容添加到层次结构中最“有效”的方法是前置或追加,因为查找最小或最大层次结构值很容易,并且执行您描述的操作需要多次查询才能找到树中的第一个“洞”

换句话说,不要给层次结构的字符串表示赋予太多意义,除非您将它们用于使用层次结构值进行排序的应用程序

即使在这种情况下,您可能也不想像您描述的那样填写层次结构值,而且可能还是希望附加到末尾

希望这有帮助

/1/1/8/-400/
/1/1/8/1/
/1/1/8/4/
/1/1/8/40/
/1/1/8/18/
/1/1/8/9999999999/