在我目前的数据库实现中,我的数据库没有任何数据/表。它获取的所有数据来自使用dblinks的其他来源,然后填充MV。这个MV实际上被我的数据库用来服务客户请求。为了实现这个,创建了一个像这样的简单视图,
CREATE View vw_Get_Data
AS
SELECT
FROM Table1@sourceDbLink t1
LEFT OUTER JOIN Table2@sourceDbLink t2 ON t1.id = t2.id
LEFT OUTER JOIN Table3@sourceDbLink t3 ON t2.id = t3.id
LEFT OUTER JOIN Table4@sourceDbLink t4 ON t3.id = t4.id
LEFT OUTER JOIN Table5@sourceDbLink t5 ON t4.id = t5.id
LEFT OUTER JOIN vw_Local vw1 ON t1.id = vw1.id
LEFT OUTER JOIN vw_Source2 vw2 ON vw1.id = vw2.id
现在我们使用此视图填充物化视图,下面是相同的代码,
CREATE MATERIALIZED VIEW schema.mv_Get_Data
BUILD IMMEDIATE
REFRESH COMPLETE ON DEMAND
DISABLE QUERY REWRITE
AS
SELECT * FROM vw_Get_Data;
此MV计划每24小时刷新一次,大约需要。 20分钟完全刷新。
现在我们被要求提高刷新频率,为此我们正在考虑使用FAST刷新实现MV。为此,我们在源数据库表中实现了MV日志表,并为每个表创建了快速刷新的MV,以便在我的数据库中本地创建精确副本。由于我们有5个源表,因此在源数据库中创建了5个MV日志表,并且还创建了5个具有快速刷新选项的相应MV。然后在这些快速刷新的MV之上实现一个简单的视图,并填充应用程序正在使用的最终MV。以下是新实现的代码。 使用FAST刷新的一个MV样本
CREATE MATERIALIZED VIEW MV1
BUILD IMMEDIATE
REFRESH FAST ON DEMAND
WITH PRIMARY KEY
AS
SELECT * FROM Table1@sourceDbLink;
新简单视图的代码示例,
CREATE View vw_New_Get_Data
AS
SELECT
FROM Table1@sourceDb t1
LEFT OUTER JOIN MV1 t2 ON t1.id = t2.id
LEFT OUTER JOIN MV2 t3 ON t2.id = t3.id
LEFT OUTER JOIN MV3 t4 ON t3.id = t4.id
LEFT OUTER JOIN MV4 ON t4.id = t5.id
LEFT OUTER JOIN vw_Local vw1 ON t1.id = vw1.id
LEFT OUTER JOIN vw_Source2 vw2 ON vw1.id = vw2.id;
请在下面找到新MV的代码,
CREATE MATERIALIZED VIEW schema.New_mv_Get_Data
BUILD IMMEDIATE
REFRESH COMPLETE ON DEMAND
DISABLE QUERY REWRITE
AS
SELECT * FROM vw_New_Get_Data;
然后创建预定作业以按需执行此MV。我主要担心的是绩效。即在我们之前的实现中,我们也在一个简单的视图中加入了来自所有源的数据,然后使用这个简单的视图填充了最终的MV。
同样在我们的新实现中,我们只使用Fast refresh运行MV以在本地复制源表,稍后我们再次以简单视图加入这些Fast刷新的MV,然后用于填充最终MV。
我主要担心的是性能,因为在我的初始测试中,我没有任何显着的性能提升。我们也尝试过索引。由于连接影响性能,因为最终的MV正在刷新COMPLETE并且它一直在加入Fast刷新的MV。每个源表/ MV都有300万条记录。
请您建议是否有更好的方法来改善这项新要求的性能,因为企业要求每45分钟刷新一次,而不是24小时刷新一次,只需一次刷新需要20分钟。