暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【干货攻略】间隔分区表merge into报错-2903:间隔分区不支持自动扩展

达梦E学 2023-12-18
667



前提
间隔分区表merge into语句报错——“-2903: 语句块/包/存储函数中的间隔分区不支持自动扩展”
本期针对此报错进行问题分析及处理。




问题描述


版本: DM V8 --08134283904-20220804-166351-20005 Pack4
初始化参数: 默认
ini参数: 默认
间隔分区表执行merge into语句报错,信息如下:

同样的语句,在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 bon (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中测试情况,默认会报错:

    Oracle中测试正常:






    问题处理


    通过查询对应版本的DBA手册,搜索相关报错关键字(比如:分区表、间隔分区、自动扩展等),查找相关对应的INI参数,最终可以找到与DEL_HP_OPT_FLAG参数可能相关。该参数取值如下:
      该参数为动态、会话级参数,默认为0
      控制分区表的操作优化
      0:不优化;
      1:打开分区表DELETE优化;2:控制范围分区表创建的优化处理,转换为数据流方式实现;4:允许语句块中的间隔分区表自动扩展;8:开启对TRUNCATE分区表的优化处理;16:完全刷新时删除老数据使用DELETE方式。
      支持使用上述有效值的组合值,如7表示同时进行124的优化
      从取值发现,取值为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 bon (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);

        通过验证可以发现,将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();



          总结

          默认情况下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);

            以上为本期分享,希望能带给大家帮助。


            点击了解相关分享:

            【干货攻略】达梦数据库防误删表的小探索

            【干货攻略】SQL优化之like与in

            【干货攻略】达梦数据库通过JDBC批量获取clob数据较慢的问题

            【开班通知】DM8-DCP线上培训班招生中(2023-12月)

            【开班通知】DM8-DCA线上培训班招生中(2023年12月20日开班)



            END

            达梦知识普及

            扫码关注我们
            学习共享
            知识普及

            作者:李文
            审核:青城
            排版:达梦培训中心
            原文:引用自“达梦在线服务平台”



            文章转载自达梦E学,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论