-1

200 GB のレコード (22 億のデータ) と強力なハードウェア (16 CPU 32 GB RAM) の Oracle を備えた巨大なデータベースがあります。これらの次元でこの膨大なデータを照会する必要があります。1 時間ごとに 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 all level( business1_hour group by trunc(time,day) , business1_levels ,subscriber) (3000万 - 5000万データ)
|
business2_day_all level( business2_hour グループ by trunc(time,day) , business2_levels ,subscriber) (3000 万 - 5000 万のデータ)
|
time_levels

更新の問題を改善または解決する方法を教えてくれる人はいますか?

オラクルのバージョン: 10g

service_Record テーブル:

テーブル SERVICE_RECORD を作成 並列 16 ストレージ (最初の 1M 次の 10M) 範囲 ( servicetime ) (毎日のパーティション) によるパーティション as select s.id、s.servicetime、s.advariationId、s.blindId、s.action from tap_prod.service_Record s .servicetime > to_date('01/01/2012','dd/MM/yyyy');

my main group by data :
CREATE materialized VIEW tap_cube
parallel 16 storage (initial 1M next 10M)
partition by range( service_time )
(daily partition )
build immediately refresh fast on demand
AS
SELECT TRUNC (sr.servicetime,'HH') as service_time,
sr.advariationid AS ad_variation_id、
sr.blindid AS blind_id、
COUNT (sr.blindid) AS total_impr、
SUM (sr.action) AS total_action 、count(sr.action) as col1 、
count(*) as col2
FROM service_record sr
group by TRUNC (sr.servicetime、'HH')、sr.advariationid、sr.blindid;

私のビジネス1ロジックテーブル:

ビジネスレベル 1:

具体化されたビューの作成 cube_ty_1_adv_1_time_4
並列 16 ストレージ (最初の 10M 次の 100M) 範囲 による パーティション (
service_time )
( daily_partition
) (total_impr) as total_impr,count(total_impr) col3 , SUM (total_action) as total_action , count(total_action) as col1 , count(*) as col2 FROM tap_cube mycube, dim_advertisement adv WHERE mycube.ad_variation_id = adv.ad_variation_id group by CAST ( mycube.service_time AS TIMESTAMP)、ADV.broker_id、blind_id;












ビジネス 1 次元レベル:

CREATE table
dim_advertisement
AS
SELECT bro.id AS ブローカー ID、
adver.id AS 広告主 ID、
camp.id AS キャンペーン ID、
adv.id AS 広告 ID、
ad.id AS ad_variation_id
FROM
tap_prod.advertisement adv、
tap_prod.ad_variation 広告、
tap_prod.campaign キャンプ、
tap_prod.advertiser adver、
tap_prod.broker bro
WHERE
bro.id = adver.brokerid
and camp.advertiserid = adver.id
AND camp.id = adv.campaignid
and ad.advertisementid = adv.id;

4

1 に答える 1

0

一般的なアドバイス:

  1. 適切なバランスを取るために、PGA とバッファ キャッシュのアドバイザリに注意してください。
  2. 私が見た Oracle データ ウェアハウスのパフォーマンス低下の最も一般的な原因は、I/O スループットの低下です。読み取り/書き込み帯域幅については言及していませんが、それを知って引用する必要があります。
  3. 少なくとも 3 つの MV 更新メカニズム (MV ログ、ダイレクト パス ログ、およびパーティション変更追跡) があります。それらは大きく異なり、使用するものはデータ ロード メカニズムによって異なります。それについてもっと情報を提供しましょう。
  4. 62 MV は、これまでに見たことがない数です。1 回のトランザクションで MV がすべて更新される場合、10046 スタイルのトレースを有効にしたり、AWR などのツールを使用したりしないと、MV を監視および診断することが困難になります。私の経験では、MV の更新は常に最も効率的なプロセスではありませんでした。パフォーマンスを向上させるために、サマリー テーブルを手動でメンテナンスすることを検討する価値があるかもしれません。
于 2012-12-11T08:28:32.490 に答える