【问题标题】:Materialized view refresh with 2 billion data20亿数据的物化视图刷新
【发布时间】:2012-12-11 06:26:22
【问题描述】:

我有一个庞大的数据库,其中包含 200gb 记录(22 亿数据)和强大的硬件(16 cpu 32 gb ram)Oracle。我需要在这些维度上查询这些庞大的数据。每小时有 200.000 条新记录添加到我的事实表中

时间 --> 年、月、日、小时
业务 1 --> 4 级
业务 2 --> 3 级
订阅者 --> 100 万

business1 和 business2 在同一最低级别匹配,称为 ad_variation
1 个 service_record 表(20 亿数据)

service_record 包括时间戳、订阅者 ID、ad_variation_id 中的时间

为了查询这些庞大的系统,我使用了 62 个物化视图,但系统有时会出现问题,例如 12008: ORA-12008: error in materialized view refresh path

我的系统
service_record(20 亿数据)
|
my_cube (service_record group by time , ad_variation_id,subscriber ) (5亿数据)
|
business1_hour 所有级别(my_cube group by trunc(time,hour) , business1_levels ,subscriber) (2亿-6亿数据)
|
business2_hour_all level(my_cube group by trunc(time,hour) , business2_levels ,subscriber) (2亿-6亿数据)
|
business2_day 所有级别(business1_hour group by trunc(time,day) , business1_levels ,subscriber) (3000 万 - 5000 万数据)
|
business2_day_all level(business2_hour group by trunc(time,day) , business2_levels ,subscriber) (3000 万 - 5000 万数据)
|
time_levels

有人可以告诉我如何改进或解决刷新问题吗?

Oracle 版本:10g

service_Record 表:

创建表SERVICE_RECORD并行16存储(初始1M下10M) 按范围划分(服务时间) ( 每日分区 ) 作为 选择 s.id、s.servicetime、s.advariationId、s.blindId、s.action 从 tap_prod.service_Record s where s.servicetime > to_date('01/01/2012','dd/MM/yyyy');

我的主要数据组:
创建物化视图 tap_cube
并行16存储(初始1M下10M)
按范围划分(服务时间)
(每日分区)
按需快速构建即时刷新
作为
选择 TRUNC (sr.servicetime,'HH') 作为 service_time,
sr.advariationid AS ad_variation_id,
sr.blindid AS 盲标识,
COUNT (sr.blindid) AS total_impr,
SUM (sr.action) AS total_action , count(sr.action) as col1 ,
count(*) as col2
FROM service_record sr
按 T​​RUNC (sr.servicetime,'HH')、sr.advariationid、sr.blindid 分组;

我的business1逻辑表:

业务级别 1:

创建物化视图 cube_ty_1_adv_1_time_4
并行16存储(初始10M下100M)
按范围划分(服务时间)
( 每日分区
)
按需快速构建即时刷新
作为
选择
CAST (mycube.service_time AS TIMESTAMP) AS service_time,
ADV.broker_id 作为 entity_id,
盲ID,
SUM (total_impr) as total_impr,count(total_impr) col3 ,
SUM (total_action) 作为 total_action , count(total_action) 作为 col1 , count(*) 作为 col2
FROM tap_cube mycube,dim_advertisement adv
WHERE mycube.ad_variation_id = adv.ad_variation_id
按 CAST (mycube.service_time AS TIMESTAMP)、ADV.broker_id、blind_id 分组;

业务 1 维级别:

创建表
暗淡广告
作为
选择 bro.id 作为 broker_id,
adver.id AS 广告商_id,
camp.id 作为campaign_id,
adv.id AS 广告_id,
ad.id AS ad_variation_id
来自
tap_prod.advertisement adv,
tap_prod.ad_variation 广告,
tap_prod.campaign 阵营,
tap_prod.advertiser 广告商,
tap_prod.broker 兄弟
在哪里
bro.id = adver.brokerid
和 camp.advertiserid = adver.id
AND camp.id = adv.campaignid
和 ad.advertisementid = adv.id;

【问题讨论】:

  • 什么类型的MV?什么版本的甲骨文?举个MV的例子。
  • 我以为你有一个包含 20 亿条记录的表......这应该是可行的。我认为我们需要更多关于正在发生的事情的信息。有问题的 MV 的代码是什么,遇到问题时的更改速度是多少等。
  • Oracle 版本为 10g 。此应用程序是一个广告管理系统。订阅者每小时查看 200.000 个新横幅。我们的目标是获取关于在时间空间(年、月、日、小时)级别上看到横幅的订阅者和唯一订阅者数量的报告结果。

标签: oracle olap


【解决方案1】:

一般建议:

  1. 密切关注您的 PGA 和缓冲区缓存建议,以确保平衡。
  2. 据我所知,Oracle 数据仓库性能不佳的最常见原因是 I/O 吞吐量不佳。您没有提及您的读/写带宽,但您应该知道并引用这一点。
  3. 至少有三种 MV 刷新机制——MV 日志、直接路径日志和分区更改跟踪。它们非常不同,使用的那些取决于您的数据加载机制。让我们了解更多相关信息。
  4. 62 MV 比我以前看到的要多。如果您的 MV 在一个事务中全部刷新,那么如果不打开 10046 式跟踪或使用 AWR 等工具,您将难以监控和诊断它。根据我的经验,MV 刷新并不总是最有效的过程,因此可能值得考虑手动维护汇总表以提高性能。

【讨论】:

    猜你喜欢
    • 2021-10-14
    • 2014-07-11
    • 2017-11-13
    • 1970-01-01
    • 2019-07-24
    • 2018-03-20
    • 2019-11-30
    • 2017-06-07
    • 2012-07-04
    相关资源
    最近更新 更多