【发布时间】:2019-11-30 06:00:42
【问题描述】:
我们目前正在从一个数据库迁移到另一个数据库。 我们有大约 6000 万用户和 150 亿联系人。 对于迁移,我们希望将两个表分开以仅保存活动对象。
我们正在创建一个仅包含在 2016 年之后登录或仍在付费的活跃用户的视图。 ~ 800 万行
现在我们要创建一个包含有效联系人的视图,其中仅包含用户视图中的用户和合作伙伴。 ~ 4 亿行
用户视图的构建和刷新大约需要 1 小时。 但是联系人的视图大约需要 14 天。之后刷新它而不改变超过 5 天。 -> 我们正在使用日志构建用户视图。对于联系人,我们使用日志联系人和用户视图。
CREATE MATERIALIZED VIEW LOG ON SCHEMA.USER with rowid, primary key including new values;
CREATE materialized view SCHEMA.ACTIVE_USERS
BUILD DEFERRED
REFRESH FAST
DISABLE QUERY REWRITE
as
select u.*, u.ROWID as U_ROWID
from SCHEMA.USER u
where -- only active users;
CREATE MATERIALIZED VIEW LOG ON SCHEMA.CONTACTS
WITH PRIMARY KEY, ROWID
INCLUDING NEW VALUES;
CREATE MATERIALIZED VIEW SCHEMA.ACTIVE_CONTACTS
PARALLEL
BUILD DEFERRED
REFRESH FAST
DISABLE QUERY REWRITE
AS
SELECT /*+ PARALLEL */ EM.*,
EM.ROWID AS EMROWID
FROM SCHEMA.CONTACTS EM
INNER JOIN SCHEMA.ACTIVE_USERS AU ON AU.userid = EM.userid
INNER JOIN SCHEMA.ACTIVE_USERS AU2 ON AU2.userid = EM.partnerid
WHERE -- only active contacts;
解决此问题的最佳解决方案是什么?
【问题讨论】:
-
移动所有客户!人为地引入截断日期会使后续分析变得更加棘手。
-
@GordonLinoff 在两个表上都有我们正在使用的日期的索引
标签: oracle performance materialized-views