我有一个包含分层数据的表。目前在这个层次中有〜8个层次。创建分层定义的数据集的展平表/视图
我真的很喜欢的方式,数据的结构,但性能是令人沮丧的,当我需要知道,如果在8级的纪录是在级别1
记录的一个孩子,我有PL/SQL存储函数为我做这些查询,每个都有一个select * from tbl start with ... connect by...
声明。当我查询一些记录时,这很好,但我现在处于一种情况,我需要一次查询〜10k条记录,并且每个记录都运行此函数。这需要2-3分钟,我需要它在几秒钟内运行。
根据我对当前数据的了解,我可以摆脱查找功能,只是做childrecord.key || '%' LIKE parentrecord.key
,但这是一个非常肮脏的黑客攻击,并不总是工作。
所以现在我想这对于这个分层定义的表我需要有一个单独的父子表,它将包含每一个关系...对于层次从1-8级将会有8!记录,将1与2,1与3,...,1与8和2与3,2与4,...,2与8相关联。等等。
我的想法是,我需要一个插入触发器,它将基本上运行connect by
查询,对于层次结构中的每个匹配项,它都会在查找表中插入一条记录。而为了处理旧数据,我只需将级联删除的外键设置到主表。
有没有比这更好的选择?我是否错过了另一种可以更快地确定这些遥远的祖先/后代关系的方式?
编辑:这似乎正是我在想:http://evolt.org/working_with_hierarchical_data_in_sql_using_ancestor_tables
您是否主要对回答“谁是我的最终父母?”这个问题感兴趣?或者“谁是我的第一位父亲,并定义了一些属性?”如果是这样,物化视图可能比触发器更容易和更安全。 – 2010-08-02 23:47:12
@Adam Musch:我很想知道任何两个记录是否相互关联。你指的是什么样的安全问题?未能锁定相应的记录并获取损坏的数据? – 2010-08-03 04:24:19
主要是数据损坏,是的。通过表维护传递闭包v物化视图意味着可以独立更新 - 触发器可以被禁用,映射表可以有针对它们写入的SQL。我写了物化视图来看“上游”来回答我在我之前的评论中提到的问题,但不回答“谁是B的祖先的全部”或“是B的祖先?”的通用形式。 – 2010-08-03 12:45:19