我有一个包含三个“级别”对象的数据库:A
、B
和C
。表A
有大约 100000 行,B
有 500000,C
有 200 万。
出于愚蠢,我将数据库设计为使用连接表AB
和BC
,即使它们是 1:m 并且可以表示为 中的ParentA
属性B
和 中的ParentB
属性C
。我这样做是因为当时我认为这些可能是 m:m。
现在,我还有一个D
与 有 am:m 关系的表C
。为了简化用户的数据管理,允许他们D
与每个.A
B
C
因此,我有连接表DA
、DB
和DC
,以及一个连接视图DC2
,其中包括和连接DC
的继承DC
关系。我为此使用了 UNION ALL,并且有一些业务逻辑可以防止用户在两个级别分配相同的记录。DA-AB-BC
DB-BC
D
问题是,性能DC2
有点糟糕。所有其他表都有适合这些连接的覆盖索引,并且覆盖索引是聚集的。DC2 不包括表A
、B
、C
或D
,仅包括连接表。
还有表 E、F、G 和 H,它们在与 A、B 和 C 的关系方面与 D 相似。
我可以使用哪些策略来改善这些继承关系的性能?
已经想到:
- 制作
DC2
索引视图不是一种选择,因为在 MSSQL 的索引视图中不允许使用 UNION。 - 我可以使 DC2 成为一个表并使用触发器对其进行管理,但这会很痛苦,而且我还有 EC2、FC2 等需要处理。我不能让它在哪里
- 将 AB 和 BC 更改为 B 和 C 的属性实际上可能会减慢速度,因为连接表更轻并且主表不经常连接到 DC2。
我会反过来看你的索引视图:
为您的对象准备表 O,存储 A、B 和 C,以及一个级别字段。然后根据 O 的查询为 A、B 和 C 创建索引视图。也许使用 hierarchyid 字段来了解每个记录的完整树。
您可以做的还有很多,但这可能是一个有用的开始。