代码之家  ›  专栏  ›  技术社区  ›  Logically_Sound

SQL CTE-由于子对象的子对象,递归速度较慢….:

  •  0
  • Logically_Sound  · 技术社区  · 7 年前

    我有一张有父母和孩子关系的表。大约有10000条记录(其他类似的表可能高于或低于这个数字)。 table preview

    我将pk\u primarykey列设置为聚集索引,父列和子列设置为非聚集索引。

    所以,最终目标是遍历每个子对象,递归地标识每个值的所有子对象。因为我想遍历整个子元素列表,所以不能用递归级别来限制它。

    例如,我使用下面的子查询568866,大约需要10秒才能返回18039行(子的子的子…整个列表)。对于一个值来说,这并不太糟糕,但当我循环遍历每个10K子记录时,时间真的累积起来了。

    如果有人能提出一种加速记录检索的方法,那将非常有帮助。

    with trace_tree (pk_primarykey, childid) as 
    (select pk_primarykey, childid from #parent_child_relationships where childid = 571951 
    union all 
    select c.pk_primarykey, c.childid from #parent_child_relationships c join trace_tree p 
    on p.childid = c.parentid) 
    select pk_primarykey from trace_tree where childid <> 571951 
    1 回复  |  直到 7 年前
        1
  •  1
  •   Radim Bača    7 年前

    你考虑过使用标签方案吗?外面有很多这样的人。其中最常见的是包含标记方案。您只需像这样为树中的每个节点分配一个节点标签

    enter image description here

    这些标签可以使用树的一个前序遍历(如果使用堆栈)分配给每个节点。这些标签可以作为新属性添加到表中 start , end . 一旦计算出标签,就需要创建这样的索引 table(start, end, pk_primarykey) table(childid, start, end) . 如果要查找某个节点的子代,请处理:

    select t2.pk_primarykey
    from #parent_child_relationships t1
    join #parent_child_relationships t2 on t2.start > t1.start and t2.end < t1.end
    where t1.childid = 571951
    

    或者更容易,如果你有 开始 终止 需要其子体的节点的值(例如(100200)),则查询可以是

    select pk_primarykey
    from #parent_child_relationships on start > 100 and t2.end < 200