2012-12-11 81 views
-1

我有一個龐大的數據庫,包含200GB記錄(22億個數據)和強大的硬件(16個CPU 32 GB RAM)Oracle。我需要在這些維度上查詢這些龐大的數據。每小時200.000新記錄添加到我的事實表具有20億數據的物化視圖刷新

時間 - >年,月,日,小時
業務1 - > 4級
業務2 - > 3級
用戶 - >一百萬個

業務1和業務2中相同的最低水平的匹配稱爲ad_variation
1 service_record表(2個十億數據)

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)(500萬data)
|
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萬-5千萬個數據)
|
business2_day_all level(business2_hour group by trunc(time,day),business2_levels,subscriber) (3000萬-5千萬個數據)
|
time_levels

有沒有人可以爲我提供如何改進或解決刷新問題?

Oracle版本:10g中

service_Record表:

創建表SERVICE_RECORD並行16存儲(初始1M下10M) 分區由範圍(servicetime) ( 每日分區 )作爲 從tap_prod.service_Record中選擇s.id,s.servicetime,s.advariationId,s.blindId,s.action 其中s。服務時間> to_date('01/01/2012','dd/MM/yyyy');

我的主要組由數據:
CREATE物化視圖tap_cube
並行16存儲(初始1M下10M)
分區由範圍(service_time)
(每日分區)
構建立即刷新快速上要求
AS
SELECT TRUNC(sr.servicetime, 'HH')作爲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,計數(sr.action)爲COL1,
COUNT(*)作爲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

build immediate新鮮的快速需求

選擇
CAST(mycube.service_time AS TIMESTAMP)AS service_time,
ADV.broker_id爲ENTITY_ID,
blind_id,
SUM(total_impr)作爲total_impr,計數(total_impr)COL3,
SUM(total_action)作爲total_action,計數(total_action)如COL1,COUNT(*)作爲COL2
FROM tap_cube mycube,dim_advertisement進階
WHERE mycube.ad_variation_id = adv.ad_variation_id
組由CAST(mycub e.service_time AS TIMESTAMP),ADV.broker_id,blind_id;

業務1個維度級別:

CREATE表
dim_advertisement
AS
選擇bro.id AS broker_id,
adver.id AS ADVERTISER_ID,
camp.id AS CAMPAIGN_ID,
進階.id AS advertisement_id,
ad.id AS ad_variation_id
FROM
tap_prod.advertisement進階,
tap_prod.ad_variation廣告,
tap_prod.campaign陣營,
tap_prod。廣告客戶adver,
tap_prod.broker BRO
WHERE
bro.id = adver.brokerid
和camp.advertiserid = adver.id
AND camp.id = adv.campaignid
和ad.advertisementid =進階。 ID;

+0

什麼類型的MV?什麼版本的Oracle?舉一個MV的例子。 –

+0

我以爲你有一張有20億記錄的桌子......這應該是可行的。我想我們需要更多關於正在發生的事情的信息。什麼代碼是有問題的MV,以及當你遇到問題時的變化速度等等。 – Ben

+0

Oracle版本是10g。此應用程序是一個廣告管理系統。用戶每小時都會查看200.000條新標語。我們的目標是根據多少用戶和唯一用戶在時間空間(年,月,日,小時)水平上看到橫幅來報告結果。 – user1893727

回答

0

一般建議:

  1. 保持你的PGA的眼睛和緩衝區緩存顧問,以取得平衡。
  2. Oracle數據倉庫中性能低下的最常見原因是我看到的I/O吞吐量很差。你沒有提到你的讀/寫帶寬,但你應該知道並引用它。
  3. 至少有三個MV刷新機制 - MV日誌,直接路徑日誌和分區更改跟蹤。他們是非常不同的,並且正在使用中的一個取決於您的數據加載機制。讓我們有更多的信息。
  4. 62 MV比我以前見過的多。如果您的MV在一次事務中全部刷新,那麼您將無法在不啓用10046風格跟蹤或使用AWR等工具的情況下進行監視和診斷。在我的經驗中,MV刷新並不總是最有效的過程,可能需要手動維護彙總表以提高性能。