我有一个视图可以从大约30个不同的表中提取。有一个主表,还有29个表联接到主表。
-- master view
select
m.mkey, m.x, m.y, a.i, func(b.j) bjfunc, c.k ...
from
master m left join
atable a on
m.akey = a.akey left join
btable b on
m.bkey = b.bkey left join
ctable c on
m.ckey = c.ckey
...
我们有一个应用程序需要使用该视图,并使用从该视图返回的所有数据,因此我需要将其保持不变。随着我们的不断发展,我们发现自己也在选择视图的子集以及用于其他应用程序。在这种情况下,我们根本无法使用该视图,因为它对于需要的东西来说太重了,我们最终创建了新视图,该视图复制了主视图的一部分。
-- sub-view abview
select
m.mkey, m.y, a.i, func(b.j) bjfunc
from
master m left join
atable a on
m.akey = a.akey left join
btable b on
m.bkey = b.bkey
我想我可以按如下方式将该子视图替换回主视图:
-- master view
select
m.mkey, m.x, ab.y, ab.i, ab.bjfunc, c.k ...
from
master m left join
abview ab on
m.mkey = ab.mkey left join
ctable c on
m.ckey = c.ckey
...
这将有助于使两个视图保持同步,并通过将连接/别名切成两半来使主视图在美学上更具美感。
最后: 我的问题是,这会在多大程度上影响主视图的性能?我不确定优化器将这些子视图组合在一起的性能如何。链接主表查询上的每个子视图与原始链接主表上的所有表的原始主视图。
我最好只保留单独的视图吗?
我一直在做一些基准测试。
每次看到一个新的子视图,我都可以看到对主表的逻辑读取次数增加。
查询持续时间似乎仅受到轻微影响。我认为现在的问题是可维护性与性能,以及两者之间的平衡。