2017-03-21 56 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小时一次或在执行处理更改后的作业后按要求进行。