【问题标题】:SQL: Build a materialized view from a materialized view with billion of rowsSQL:从具有数十亿行的物化视图构建物化视图
【发布时间】: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


【解决方案1】:

与所有性能问题一样,猜测多于答案。以下是一些:

  • 将 180 亿行的表连接到 600 万行的表 - 两次 - 在任何情况下都不会很快
  • 也许 ACTIVE_USERS 上的某些索引可能会有所帮助
  • 从 ACTIVE_CONTACTS 构建 ACTIVE_CONTACTS 肯定是一个错字。我猜你的意思是从 CONTACTS 查询
  • 不要低估“WHERE -- 只有活动联系人”的复杂性。也许最好把它过滤到垫子上。先查看,再加入。
  • 要深入了解性能,请尝试将您的场景转换为多个 CREATE TBALE AS SELECT... 语句。这样,您可以评估每个步骤的执行计划并查看那里的瓶颈。如果您达到连接的内存限制,它可能会溢出到临时表空间,从而导致速度大幅下降。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 2021-05-04
    • 2015-02-11
    • 2017-03-26
    • 1970-01-01
    • 2019-10-07
    • 2014-06-07
    相关资源
    最近更新 更多