【问题标题】:Should I worry about running out of HierarchyIDs?我应该担心 HierarchyID 用完吗?
【发布时间】:2010-05-15 14:36:38
【问题描述】:

当您在其他两个之间请求新的 HierarchyID 时,结果会逐渐变长。例如,在 2/5.6 和 2/5.7 之间只有 2/5.6.1 和其他 4 个组件路径。 HierarchyID 数据类型限制为 800 个字节,因此您不能永远重复此操作。再说一次,整数类型也是有限的,但在实践中这不是问题。我是否应该定期对我的表格进行碎片整理,以免高度无限增长?

【问题讨论】:

    标签: sql-server hierarchy hierarchyid


    【解决方案1】:

    hierarchyid 被认为是一种“最佳实践”来“附加”新 ID,这样您就根本不用使用那些中间状态(例如 /2/5.6/)。如果您的hierarchyid 是一个集群主键,那么这对性能不利,它会导致类似于uniqueidentifier 的页面拆分。

    如果您生成 顺序 个子级,您就不太可能需要担心用完; 每个父母可以拥有数百万个孩子。

    Here 是一个示例,说明您应该如何生成 hierarchyid 值:

    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
    BEGIN TRANSACTION 
        UPDATE Hierarchy
        SET @LastChild = LastChild = HId.GetDescendant(LastChild, NULL)
        WHERE HId = @ParentID
    
        INSERT Hierarchy (HId, ...)
        VALUES (@LastChild, ...)
    COMMIT
    

    如果您以这种方式生成 id,请放心,您永远不必担心用完。


    出于好奇,我进行了一次快速测试,以确定您可以走多远。这是一个测试脚本:

    DECLARE
        @parent hierarchyid,
        @child hierarchyid,
        @high hierarchyid,
        @cnt int
    
    SET @parent = '/1/'
    SET @child = @parent.GetDescendant(NULL, NULL)
    SET @cnt = 0
    
    WHILE (@@ERROR = 0)
    BEGIN
        SET @cnt = @cnt + 1
        PRINT CAST(@cnt AS varchar(10)) + ': ' + @child.ToString()
        SET @high = @parent.GetDescendant(@child, @high)
        SET @child = @parent.GetDescendant(@child, @high)
    END
    

    您可以在 1426 的点嵌套级别看到它出错,因此这是您可以创建多少个“中间”节点的最坏情况限制,最坏情况意味着每个在两个嵌套最深的节点之间进行单次插入。

    正如我在 cmets 中提到的,达到这个限制非常困难,但这仍然不是一个好主意。随着您使用越来越多的“点”,实际字节长度会变长,这会降低性能。如果hierarchyid 是您的聚集索引,这将杀死页面拆分的性能。如果您尝试按父节点对节点进行排名,则 请使用排名列;从以后的SELECT 进行排序比在INSERT 期间进行排序更容易更有效,因为您必须担心事务隔离和其他此类问题。

    【讨论】:

    • 我的应用程序保持排名。实际上,我的路径中不需要斜杠“/”。在现有元素之间插入是关键。
    • @Bruno:您真的不应该将hierarchyid 视为维护特定子级排序的一种方式。是的,它能够 这样做,但它根本没有针对这种情况优化。如果你想要排名,那么添加一个排名列。 (附注:当您说不需要斜杠时,我不确定您的意思 - hierarchyid 中没有 实际“斜杠”,这只是字符串表示形式。)跨度>
    • 您建议使用哪种类型进行排名,允许在任何对之间插入?
    • @Bruno:对它们进行排名的实际标准是什么?使用它,或从中计算一些积分。为什么你需要把它变成一个插入问题(复杂)而不是排序问题(简单)?
    • 无论如何,如果你真的想要的话,你可以使用hierarchyid,用“point”ids很难达到一个实际的限制,但如果你也这样做,它往往会损害性能很多,特别是如果 hierarchyid 是您的聚集索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 2013-03-20
    • 2019-07-13
    • 1970-01-01
    相关资源
    最近更新 更多