Oracle分区插入/更新元数据?

Oracle分区插入/更新元数据?,oracle,partitioning,Oracle,Partitioning,作为一种优化策略,我们正在研究使用Oracle分区元数据来标识在过去24小时内插入/更新了哪些分区的行。我们只想处理更改的分区 有人知道分区是否存在这样的元数据吗 谢谢, Dáire如果您想使用元数据来实现这一点,而不是构建自己的监控(使用触发器、时间戳列或物化视图等),那么我认为答案有点像 如果对分区表启用监视,如下所示: ALTER TABLE my_partitioned_tab MONITORING; ,然后Oracle将跟踪表和每个分区的更新次数。此信息在DBA\u选项卡\u修改中可

作为一种优化策略,我们正在研究使用Oracle分区元数据来标识在过去24小时内插入/更新了哪些分区的行。我们只想处理更改的分区

有人知道分区是否存在这样的元数据吗

谢谢,
Dáire

如果您想使用元数据来实现这一点,而不是构建自己的监控(使用触发器、时间戳列或物化视图等),那么我认为答案有点像

如果对分区表启用监视,如下所示:

ALTER TABLE my_partitioned_tab MONITORING;
,然后Oracle将跟踪表和每个分区的更新次数。此信息在
DBA\u选项卡\u修改中可见

但是,该视图中的
TIMESTAMP
列是数据刷新时的时间戳,数据仅在需要时刷新,或收集统计信息时刷新,或实例关闭或“每隔一次”(因版本而异)

按需冲洗操作如下:

BEGIN DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO; END;
刷新后,您可以在
DBA\u选项卡\u修改中看到数据:

select partition_name, timestamp
from dba_tab_modifications
where table_name = 'MY_PARTITIONED_TAB';
但是,无论如何,在Oracle 12c中,
时间戳将是刷新数据的时间,而不是修改发生的时间。(Oracle对此表的文档在这一点上不准确/误导)


因此,归根结底,如果您能够每隔(比如说)10分钟可靠地刷新一次监视,那么您应该能够获得在过去24小时(+/-10分钟)内修改了哪些分区的近似值。

您可以使用分区更改跟踪() 以标识修改的分区

您唯一需要考虑的是在分区表上设置非常简单的物化视图,该视图包含您的分区键或分区表。 (请参阅其他以启用PCT)

PCT功能跟踪MV的基表(即分区表),并将修改的分区标记为
STALE
(即必须在MV中重新网格化的分区)。您可以使用字典视图
USER\u MVIEW\u DETAIL\u分区

示例

分区表和PCT MV的设置

现在,让我们检查MV元数据

这是初始状态,我们有一个新分区。让我们在同一分区中添加另一条记录

正如所料,分区现在已过时。现在我们在另一个分区中添加了一条新记录(注意,我使用区间分区,所以分区将自动创建)

仍然可以,现在我们有两个过时的分区

如果要重置状态(即在运行作业处理更改的分区后),只需刷新物化视图,所有分区将再次刷新

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(方法='p'),因此只有过时的分区将被重新聚集


MV的刷新将重置更改状态;您可以根据需要对此进行完全控制—每24小时一次,或在执行处理更改的作业后根据需要进行控制。

您的表中是否有时间戳列?如果是这样的话,你可以用它来解决这个问题。听起来你在寻找能够告诉你哪些分区在过去24小时内进行了更新的信息。我不相信有什么特别告诉你的。但是,请看以下两个视图。用户选项卡分区和用户选项卡修改。搜索并阅读它们可以提供的内容。您试图执行什么“处理”呢?我们正在为ETL对Hadoop集群进行sqoop更改/增量(表为1.2B行),考虑尝试针对特定分区,仅sqoop那些分区以加快传输。我将深入研究,这看起来很有希望。谢谢你的帮助。
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 
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