Long Row 是什么?
Long Row = 允许一行数据超长
- 达梦默认:一行数据不能超过 “页大小的一半”
- 开启
LONG ROW之后:这张表不再严格限制单行总长度,超长的字段会自动放到行外面存,只留一个指针在行里。
大白话:
本来一行必须塞进半页里,现在允许 “一部分数据挂在行外面”,表就不会报 “记录超长”。
为什么需要 Long Row?
因为达梦有一个很严格的物理限制:
规则
- 数据库按 “页” 存储数据(4K/8K/16K/32K)
- 单行数据长度 ≤ 页大小 / 2 (假设表有2字段:id、name 这俩字段算单行数据)
常见场景一定会超限
- 一张表里有 好几个长 VARCHAR 比如:标题、内容、备注、摘要、URL、文件名……
- 加起来总长度轻松超过 4000 / 8000 字节
- 结果:插入失败 → 记录超长
为什么不直接用 CLOB/TEXT?
- 改字段类型要改代码、改映射、改 SQL
- 老项目、迁移项目(尤其是 Oracle 迁移)不想动结构
- Long Row 是零代码改动、最快的解决方案
如何判断是否要开启 Long Row?
满足下面任意一条,就应该开:
① 你遇到了这个错误
记录超长
-2665 错误
Data too long for row
② 表字段长度总和接近 / 超过半页上限
| 页大小 | 单行最大安全长度 |
|---|---|
| 8K | 约 4000 字节 |
| 16K | 约 8000 字节 |
| 32K | 约 16000 字节 |
你可以用 SQL 看字段总长
SELECT SUM(DATA_LENGTH)
FROM DBA_TAB_COLUMNS
WHERE TABLE_NAME = '你的表名';
③ 表中有很多长文本、富文本、备注
比如:
- 文档内容、文章详情
- 多条备注、多个长描述
- 存储 Base64、大段 JSON、HTML
这种 100% 要开 LONG ROW。
开启Long Row 带来什么问题?
开启后能解决报错,但有代价,你必须知道:
① 性能变差
- 长数据存在行外,需要多一次 IO 读取
- 查询长字段会比普通行内字段慢
② 不能随便建索引
- 超长字段不能建普通索引(会报索引超长)
- 只能用全文索引
③ 不适合频繁更新的大字段
行外存储机制对频繁修改的超大文本不算友好。
④ 只对当前表生效
不是一开全局生效,每张容易超长的表都要单独开。
超级精简总结
Long Row 是什么:允许行数据超长,自动把部分字段存到行外
Long Row 带来什么问题:性能略降、索引受限、只表级生效
为什么需要:达梦单行限制太严,多几个长文本就超限报错
怎么判断要开:报 -2665 / 字段总长接近半页 / 存大文本
核心查询SQL
-- 查看页大小(输出单位是K)
SELECT SF_GET_PAGE_SIZE() AS PAGE_SIZE_KB;
-- 输出:32768 表示你是32K的 也就是一行全部字段不得超过16000字符,上文有对照表,自己看
-- 查看你的表是否已启用 LONG ROW
SELECT
OWNER AS "表所属",
TABLE_NAME AS "表名",
STATUS AS "状态",
LONG_ROW AS "是否开启长行"
FROM DBA_TABLES
WHERE TABLE_NAME = 'SomeTable';
-- 开启达梦的长行 Long Row
ALTER TABLE 你的表名 ENABLE USING LONG ROW;
-- 查看表字段长度总和,判断是否超限
SELECT
TABLE_NAME,
SUM(DATA_LENGTH) AS TOTAL_FIELD_LENGTH
FROM DBA_TAB_COLUMNS
WHERE TABLE_NAME = 'DOC_REVIEW_ITEM'
GROUP BY TABLE_NAME;
特殊说明:
上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤
免责声明: 本站文章旨在总结学习互联网技术过程中的经验与见解。任何人不得将其用于违法或违规活动!所有违规内容均由个人自行承担,与作者无关。
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤
免责声明: 本站文章旨在总结学习互联网技术过程中的经验与见解。任何人不得将其用于违法或违规活动!所有违规内容均由个人自行承担,与作者无关。
