【发布时间】: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
按 TRUNC (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 个新横幅。我们的目标是获取关于在时间空间(年、月、日、小时)级别上看到横幅的订阅者和唯一订阅者数量的报告结果。