如何有效地表示树的继承?

ric*_*ent 5 sql-server-2005 hierarchy

我有三个对象的“级别”数据库:AB,和C。表A有大约 100000 行,B有 500000,C有 200 万。

出于愚蠢,我将数据库设计为使用连接表ABBC,即使这些是 1:m 并且可以表示为ParentA属性 inBParentB属性 in C。我这样做是因为我当时认为这些可能是 m:m。

现在,我还有一个表D,它与C. 为了简化用户的数据管理,这是有道理的,让他们涉及DAB而不是直接到每个C

所以,我已经连接表DADB以及DC和加入视图DC2,包括DC以及继承的DC关系,从加入的DA-AB-BCDB-BC。我为此使用了 UNION ALL,并且有一些业务逻辑可以防止用户D在两个级别分配相同的记录。

问题是,DC2有点糟糕的表现。所有其他表都具有用于这些连接的适当覆盖索引,并且覆盖索引是聚集的。DC2 不包括表ABCD,仅包括连接表。

还有表 E、F、G 和 H,它们在与 A、B 和 C 的关系方面与 D 相似。

我可以使用哪些策略来提高这些继承关系的性能?

已经想到:

  • 使DC2索引视图不是因为UNION未在MSSQL索引视图允许的选项。
  • 我可以让 DC2 成为一个表并用触发器管理它,但这会很痛苦,而且我还有 EC2、FC2 等要处理。我不能去哪里
  • 将 AB 和 BC 更改为 B 和 C 的属性实际上可能会减慢速度,因为连接表更轻且主表不经常连接到 DC2。

Rob*_*ley 2

我会以相反的方式查看您的索引视图:

为您的对象准备表 O,存储 A、B 和 C 以及一个级别字段。然后根据 O 的查询为 A、B 和 C 创建索引视图。也许可以使用 Hierarchyid 字段来了解每个记录的完整树。

您还有很多事情可以做,但这可能是一个有用的开始。