
在达梦数据库上,有时候在做数据库移植或应用开发测试过程中会遇到“记录超长”的错误。报错“记录超长”字面意思很好理解,但是跟哪些因素有关呢?

这个报错其实根据字面意思我们大概知道是数据的长度超长,对达梦数据库比较熟悉的使用者其实是知道该如何处理的,一般来说有以下两种方法:
1、重新初始化实例,设置更大的页大小。
2、对报错的表开启超长记录。
下面我们通过举例来讨论这个记录超长的具体原因并进行分析,分析过程中我们要提到以下几个概念:
页大小(page_size) 超长记录 行内数据与行外数据 配置参数LOB_MAX_INROW_LEN
页大小
第一,当页大小为8K时,对于字符类型实际最大长度为3900字节(不同页大小影响字符类型实际的最大长度是不一样的,见下图所示)。

create table test_singlecol( col varchar(8000));insert into test_singlecol values(repeat('a',4000)); --报错,因为超过3900了insert into test_singlecol values(repeat('a',3880)); --报错,因为超过3900了insert into test_singlecol values(repeat('a',3879)); --正常插入,还有20个自己被内置的存储占用,例如伪列rowid,trxid还有null标记等
select lengthb(rowid),lengthb(trxid),* from dual;

超长记录
ALTER TABLE test_singlecol ENABLE USING LONG ROW;insert into test_singlecol values(repeat('a',3880)); --正常插入insert into test_singlecol values(repeat('a',4000)); --正常插入
在基表中,当没有指定 USING LONG ROW 存储选项时,插入 VARCHAR 数据类型的实际最大存储长度由数据库页面大小决定,如果指定了 USING LONG ROW 存储选项,则插入 VARCHAR 数据类型的长度不受数据库页面大小限制。VARCHAR 类型在表达式计算中的长度上限不受页面大小限制,为 32767;
行内数据与行外数据
drop table if exists test_text;create table test_text(col text);insert into test_text values(repeat('a',901));commit;select dump(col) from test_text;

call create_table(39,'varchar(4000)');call insert_table(39,4000);-- -2665: 记录超长alter table "SYSDBA"."TEST_39COL" enable using long row;call insert_table(39,4000);--正常插入对于text类型表定义:drop table if exists TEST_39COL;call create_table(39,'text');call insert_table(39,50);-- 正常插入,行内call insert_table(39,100);-- 正常插入,行外call insert_table(39,4000);-- 正常插入,行外select dump(c1),dump(c2),dump(c3),dump(c4) from TEST_39COL;

LOB类型行内存储最大长度
select * from v$dm_ini where para_name like 'LOB%';

create table test_lob(col text);insert into test_lob values(repeat('a',901));--行外insert into test_lob values(repeat('a',900));--行内commit;select dump(col) from test_lob;

综上所述,达梦数据库中报错“记录超长”与上述因素都有关系,其中页大小是影响最大的一个因素,如果业务场景中涉及的表都会比较“宽”,那么建议直接将页大小设置大一些,可以避免一些记录超长的问题,但是相对来说也会更加浪费空间一些,这里需要dba做一些权衡。
以上为本期分享,希望能带给大家帮助。想要了解更多往期干货,可访问页面最下方#达梦技术干货攻略#合集或下方相关分享。在此邀请更多学员参与“达梦技术干货投稿活动”,稿件获选后将在达梦“干货分享”专栏进行发布,欢迎来稿!
【干货攻略】SQL优化之-LIKE CASE WHEN改写思路

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




