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