查PCT能力是否启用,需执行DBMS_MVIEW.EXPLAIN_MVIEW并查询MV_CAPABILITIES_TABLE中capability_name='PCT'的记录,若msgtxt显示"relation is not partitioned"说明基表未分区,"enhanced update tracking not enabled"说明未启用EUT,DISABLED则可能漏建ENABLE QUERY REWRITE或未启用PCT支持。

查 PCT 能力是否启用,先看 EXPLAIN_MVIEW 输出
物化视图是否走 PCT(Partition Change Tracking)刷新,不靠猜,也不靠日志里有没有“PCT”字样——得看 EXPLAIN_MVIEW 的实际能力评估结果。它会明确告诉你当前定义下 PCT 是否可用。
执行前确保已建好 MV_CAPABILITIES_TABLE(用 @?/rdbms/admin/utlxmv.sql):
EXEC DBMS_MVIEW.EXPLAIN_MVIEW('YOUR_MV_NAME');
然后查:
SELECT capability_name, related_text, msgtxt FROM MV_CAPABILITIES_TABLE WHERE statement_id = 'QSMQT_EXPLAIN_MVIEW' AND capability_name = 'PCT';
- 若
capability_name = 'PCT'对应的msgtxt是relation is not partitioned,说明基表根本没分区,PCT 自然不生效 - 若
msgtxt是enhanced update tracking not enabled on table,说明分区表没开 EUT(ALTER TABLE ... ENABLE ROW MOVEMENT+DBMS_PART.CLEANUP_PARTITION_CHANGE_TABLES等步骤缺一不可) - 若状态是
DISABLED且基表确为分区表,则大概率是物化视图定义中漏了ENABLE ON QUERY COMPUTATION或未在基表上启用 PCT 支持
DBA_MVIEW_LOGS 里没有 PCT 字段?别被名字误导
很多人翻 DBA_MVIEW_LOGS 找 pct_enabled 或类似字段,其实这个视图根本不存 PCT 相关标志。PCT 不依赖物化视图日志(MLOG$),而是依赖分区表自身的变更跟踪机制(EUT 表 + SYSAUX 中的元数据)。
真正要查的是基表是否启用了增强型更新跟踪:
SELECT partitioning_type, partition_count, status FROM dba_part_tables WHERE table_name = 'YOUR_PARTITIONED_TABLE';
再确认 EUT 是否就绪:
SELECT table_name, tracking_enabled FROM dba_part_tables WHERE table_name = 'YOUR_PARTITIONED_TABLE';
- 如果
tracking_enabled = 'NO',即使表已分区,PCT 刷新也必然跳过,REFRESH FAST会退回到全量或报错 - 启用 EUT 后,Oracle 会在
SYSAUX创建内部跟踪表(如PT$系列表),这些表不可手动干预,但可通过DBMS_PART.CLEANUP_PARTITION_CHANGE_TABLES清理异常残留
刷新时真走了 PCT?抓 V$MVREFRESH 和 trace 最直接
V$MVREFRESH 是运行时唯一能反映“这次到底用了什么机制”的动态视图。它不会告诉你“理论上能不能”,只说“这一次干了什么”。
在刷新前打开 session 级 trace:
ALTER SESSION SET EVENTS '10046 trace name context forever, level 8';
执行刷新后,查:
SELECT mvname, refresh_method, pct_used, start_time, end_time FROM V$MVREFRESH WHERE mvname = 'YOUR_MV_NAME' ORDER BY start_time DESC;
-
pct_used = 'YES'是最硬的证据,说明本次确实触发了 PCT 流程 - 若
refresh_method = 'FAST'但pct_used = 'NO',说明 Oracle 认为 PCT 不适用(比如分区维护操作不在支持范围内,或统计信息过期) - trace 文件里搜索
pct或partition_change,能看到类似processing partition change for table XXX的行,这是底层调用的实锤
容易忽略的兼容性断点:Oracle 版本与分区类型
PCT 不是所有分区表都一视同仁。某些组合从根上就不支持,查之前先确认底线:
- 范围(
RANGE)、列表(LIST)、组合(INTERVAL)分区默认支持 PCT;哈希(HASH)分区在 12.2+ 才支持,11g 完全不认 - 复合分区(如
RANGE-HASH)仅当最外层是 RANGE/LIST/INTERVAL 时才可能启用 PCT,内层 HASH 不影响,但也不能是唯一分区键 - 物化视图定义中若含
GROUP BY且分组列不是分区键的前缀,PCT 会被自动禁用——哪怕基表完全合规 - 12cR2 引入实时物化视图(
ON QUERY COMPUTATION)后,PCT 只用于后台刷新,前台查询计算不走 PCT,这点常被误判为“PCT 失效”


















