2017-03-21 55 views
2

作爲一種優化策略,我們正在研究如何使用Oracle分區元數據來識別哪些分區在過去24小時內插入/更新了行。我們只想處理更改的分區。Oracle分區插入/更新元數據?

有人會知道這樣的元數據是否存在分區?

感謝, Dáire

+0

你的表中是否有時間戳列?如果是這樣,你可以用它來解決它。 – Boneist

+0

這聽起來像是在尋找能夠告訴你哪些分區在過去24小時內有更新的信息。我不相信有什麼具體告訴你。但是,請看以下兩種觀點。 user_tab_partitions和user_tab_modifications。搜索並閱讀他們可以提供的內容。 – unleashed

+0

你想要執行什麼「處理」? – BobC

回答

1

如果你想與元數據要做到這一點,而不是建立自己的監控(與觸發器或時間戳列或物化視圖或東西),那麼我想答案是種類

如果啓用監控您的分區表,就像這樣:

ALTER TABLE my_partitioned_tab MONITORING; 

,那麼甲骨文將繼續跟蹤對陣表以及對每個單獨的分區更新的數量。該信息在DBA_TAB_MODIFICATIONS中可見。

但是,該視圖中的TIMESTAMP列是數據刷新時的時間戳,數據僅在需要時刷新,或者收集統計信息或實例處於關閉狀態或「每隔一段時間」(因版本而異) 。

法拉盛按需完成如下:

BEGIN DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO; END; 

沖洗就可以看到DBA_TAB_MODIFICATIONS數據後:

select partition_name, timestamp 
from dba_tab_modifications 
where table_name = 'MY_PARTITIONED_TAB'; 

但是,在Oracle 12c中反正TIMESTAMP將到時數據被刷新,而不是修改發生的時間。 (在這一點上,Oracle對此表的文檔不準確/誤導)。所以,底線,如果你可以可靠地每隔10分鐘刷新一次監控,那麼你應該能夠近似瞭解哪些分區在過去的24小時內(+/- 10分鐘)被修改了。

+0

我會深入研究,看起來很有希望。謝謝您的幫助。 – Daire

0

您可以使用分區更改跟蹤PCT) 來標識修改的分區。

唯一需要考慮的是在分區表上設置非常簡單的物化視圖,其中包含您的prtition鍵或PMARKER。 (請參閱其他requirement啓用PCT)

的PCT特徵跟蹤MV的基表(即你的分區表)和標誌修改後的分區作爲STALE (必須在MV被rereshed即分區)。你可以使用字典視圖USER_MVIEW_DETAIL_PARTITION

訪問此ifromation示例分區表的

設置和PCT MV

CREATE TABLE tp 
    ("NAME" VARCHAR2(30 BYTE), 
     "SAMPLE_MINUTE" DATE 
    ) 
PARTITION BY RANGE (SAMPLE_MINUTE) 
INTERVAL (NUMTODSINTERVAL(1,'DAY')) 
(
    PARTITION part_01 values LESS THAN (TO_DATE('01-03-2017','DD-MM-YYYY')) 
); 


insert into tp (NAME, SAMPLE_MINUTE) values ('xx', to_date('01012017','ddmmyyyy')); 
commit; 


CREATE MATERIALIZED VIEW TPM 
refresh complete on demand with primary key 
AS 
select DBMS_MVIEW.PMARKER(rowid) pm, count(*) cnt 
from tp 
group by DBMS_MVIEW.PMARKER(rowid); 

現在,讓我們來看看這些MV元

select DETAIL_PARTITION_NAME, DETAIL_PARTITION_POSITION, FRESHNESS 
from USER_MVIEW_DETAIL_PARTITION where MVIEW_NAME = 'TPM'; 

DETAIL_PARTITION_NAME   DETAIL_PARTITION_POSITION FRESHNESS 
------------------------------ ------------------------- --------- 
PART_01            1 FRESH 

所以,這是最初的統計,我們有一個分區,這是新鮮的。讓我們在同一個分區中添加其他記錄..

insert into tp (NAME, SAMPLE_MINUTE) values ('yy', to_date('01012017','ddmmyyyy')); 
commit; 

select DETAIL_PARTITION_NAME, DETAIL_PARTITION_POSITION, FRESHNESS 
from USER_MVIEW_DETAIL_PARTITION where MVIEW_NAME = 'TPM'; 

DETAIL_PARTITION_NAME   DETAIL_PARTITION_POSITION FRESHNESS 
------------------------------ ------------------------- --------- 
PART_01            1 STALE 

預期分區已經陳舊。所以,現在我們在其他的分區添加一個新的記錄(請注意,我用的間隔分區,因此該分區將自動創建)

insert into tp (NAME, SAMPLE_MINUTE) values ('yy', to_date('03032017','ddmmyyyy')); 
commit; 

select DETAIL_PARTITION_NAME, DETAIL_PARTITION_POSITION, FRESHNESS 
from USER_MVIEW_DETAIL_PARTITION where MVIEW_NAME = 'TPM'; 

DETAIL_PARTITION_NAME   DETAIL_PARTITION_POSITION FRESHNESS 
------------------------------ ------------------------- --------- 
PART_01            1 STALE  
SYS_P9341            2 STALE 

還OK,現在我們有兩個舊文件分區

如果你想簡單的刷新物化視圖(運行作業處理改變的分區後,IE)將狀態重置,所有分區都將被再次FRESH

exec dbms_mview.REFRESH(LIST => 'TPM', method => 'P', atomic_refresh => FALSE); 

select DETAIL_PARTITION_NAME, DETAIL_PARTITION_POSITION, FRESHNESS 
from USER_MVIEW_DETAIL_PARTITION where MVIEW_NAME = 'TPM'; 

DETAIL_PARTITION_NAME   DETAIL_PARTITION_POSITION FRESHNESS 
------------------------------ ------------------------- --------- 
PART_01            1 FRESH  
SYS_P9341            2 FRESH 

請注意,您正在使用PCT刷新MV(method ='P'),因此只有陳舊的分區纔會被重新標記。

MV的刷新重置更改狀態;您可以根據需要全面控制這一點 - 每24小時一次或在執行處理更改後的作業後按要求進行。