间隔分区表merge into报错“-2903: 语句块/包/存储函数中的间隔分区不支持自动扩展”

描述

版本: DM V8 --08134283904-20220804-166351-20005 Pack4
初始化参数: 默认
ini参数: 默认
执行间隔分区表上执行merge into语句报错,信息如下:
20221021184018
同样的语句,在Oracle中执行正常。

测试

创建环境:

DROP TABLE IF  EXISTS TAB_P001; 
DROP TABLE IF  EXISTS T1;
CREATE TABLE T1 AS select USERNAME,USER_ID,CREATED from dba_users;

CREATE TABLE TAB_P001
(
C1 VARCHAR2(96),
C2 TIMESTAMP(6) NOT NULL,
C3 VARCHAR2(32) NOT NULL,
 PRIMARY KEY(C3))
PARTITION BY RANGE(C2)
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))
(
PARTITION  "P_202201"  VALUES LESS THAN( to_date('2022-02-01 00:00:00','yyyy-mm-dd hh24:mi:ss') ),
PARTITION  "P_202202"  VALUES LESS THAN( to_date('2022-03-01 00:00:00','yyyy-mm-dd hh24:mi:ss'))
);  

MERGE INTO TAB_P001 a USING t1 b
on (a.C3=b.user_id)
WHEN MATCHED THEN
   UPDATE SET a.C1='UPDATED'
WHEN NOT MATCHED THEN
   INSERT (C1,C2,C3) values(b.username,b.created,b.user_id); 

COMMIT;

DM中测试情况,默认会报错:
20221021185054

Oracle中测试正常:
20221021185931

问题处理

通过查询对应版本的DBA手册,搜索相关报错关键字(比如:分区表、间隔分区、自动扩展等),查找相关对应的INI参数,最终可以找到与DEL_HP_OPT_FLAG参数可能相关。该参数取值如下:

该参数为动态、会话级参数,默认为0
控制分区表的操作优化
0:不优化;
1:打开分区表DELETE优化;
2:控制范围分区表创建的优化处理,转换为数据流方式实现;
4:允许语句块中的间隔分区表自动扩展;
8:开启对TRUNCATE分区表的优化处理;
16:完全刷新时删除老数据使用DELETE方式。
支持使用上述有效值的组合值,如7表示同时进行1、2、4的优化

从取值发现,取值为4时,允许语句块中的间隔分区表自动扩展。进行验证测试:

---修改DEL_HP_OPT_FLAG参数值为4
SP_SET_PARA_VALUE(1,'DEL_HP_OPT_FLAG',4);

---执行merge into语句
MERGE INTO TAB_P001 a USING t1 b
on (a.C3=b.user_id)
WHEN MATCHED THEN
   UPDATE SET a.C1='UPDATED'
WHEN NOT MATCHED THEN
   INSERT (C1,C2,C3) values(b.username,b.created,b.user_id); 

20221021190915

通过验证可以发现,将DEL_HP_OPT_FLAG参数值设置为4后,间隔分区表上merge into语句执行正常。

另外,根据报错信息以及参数说明,该参数默认为0时,语句块、存储过程里面涉及到间隔分区表的相关操作也会失败,修改为4后才能执行成功。测试验证如下:

---设置DEL_HP_OPT_FLAG参数值为0
SP_SET_PARA_VALUE(1,'DEL_HP_OPT_FLAG',0);

---创建存储过程并测试
create or replace procedure p_test
as
begin
insert into TAB_P001 values('AAAAA',to_date('2023-3-30','yyyy-mm-dd'),'66666');
end;

---执行存储过程
call p_test();

---设置DEL_HP_OPT_FLAG参数值为4
SP_SET_PARA_VALUE(1,'DEL_HP_OPT_FLAG',4);

---执行存储过程
call p_test();

20221021192351

小结

默认情况下DEL_HP_OPT_FLAG参数值为0时,语句块(包括merge into)、包、存储过程中的间隔分区表不支持分区自动扩展。将参数DEL_HP_OPT_FLAG的值为4后执行正常。
DEL_HP_OPT_FLAG参数属于动态、会话级参数,可直接在线修改生效,命令如下:

SP_SET_PARA_VALUE(1,'DEL_HP_OPT_FLAG',4);
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值