【发布时间】:2021-10-03 19:35:11
【问题描述】:
我在交换分区时遇到了 ORA-14097。谁能给我点灯?
我有以下 source_tbl(非分区)表,打算使用“VALID_PERIOD_END”列对其进行分区
CREATE TABLE source_tbl
( INVOICE_ID NUMBER(15,0) NOT NULL ENABLE,
LATEST_FLAG_NAME VARCHAR2(3000),
STD_HASH **RAW**(1000),
VALID_PERIOD_START TIMESTAMP (6),
VALID_PERIOD_END **TIMESTAMP** (6),
OVERSEAS NUMBER,
.. <another 20 number columns)
VIP_NO NUMBER
) partition by range(VALID_PERIOD_END)
nologging;
这个表现在有 5M 行,我想按 VALID_PERIOD_END 对其进行分区,这样如果它是 '9999-12-31 23:59:59' (当前)将在一个分区中,而其余的则在另一个分区中
我创建了第二个名为 TEMP_tbl 的表
CREATE TABLE TEMP_tbl
( INVOICE_ID NUMBER(15,0) NOT NULL ENABLE,
LATEST_FLAG_NAME VARCHAR2(3000),
STD_HASH **RAW**(1000),
VALID_PERIOD_START TIMESTAMP (6),
VALID_PERIOD_END **TIMESTAMP** (6),
OVERSEAS NUMBER,
.. <another 20 number columns)
VIP_NO NUMBER
)partition by range(VALID_PERIOD_END)
(partition p1 values less than(maxvalue)) nologging;
TEMP_tbl 具有与 source_tbl 完全相同的数据结构,因为脚本是使用驱动的 dbms_metadata.get_ddl
我已经执行了收集表状态,没有返回任何错误
EXEC DBMS_STATS.gather_table_stats(USER, upper('source_tbl'), cascade => TRUE);
但是,当我尝试执行以下交换分区语句时,出现上述错误
alter table TEMP_tbl
exchange partition p1
with table source_tbl
without validation
update global indexes
;
我已检查“user_tab_cols”,并确认 source_tbl 中没有隐藏列。会不会是因为我表中的原始列?
提前致谢!
【问题讨论】:
-
关于类似主题的另一个问题。它不完全是重复的,但它可能会有所帮助:stackoverflow.com/questions/41684333/…
-
@Del,是的,我确实注意到了,并尝试了答案中的说明。但是,我没有任何隐藏的列。这就是我建立博客的原因。
-
我确实在在线文档中看到了有关移动具有
LONG RAW列的表的注释,但在RAW上没有任何内容或关于使用这些数据类型交换分区。 -
作为替代方法,您可以考虑将
dbms_redefinition包添加 分区到现有表。它还自己处理所需的依赖关系。 -
是你实际的sql(除了***)吗?因为您的 source_tbl 代码显示“按范围分区..”
标签: sql oracle query-optimization table-partitioning