首批通过分布式安全可靠测评,为关键业务系统打造
DML 语句编写规范
更新时间:2026-04-10 11:58:01
本文介绍在 OceanBase 中进行数据库 DML 语句的编写规范。
INSERT 语句必须指定具体的字段名称,不要写成
INSERT VALUES(......)形式,请指定需要插入的 column_name。禁止
ignore index、straight_join、SQL_no_cache在生产环境使用。SQL 语句在程序中传入的参数值类型尽量保持与字段在数据库中的类型相同,否则会发生隐式类型转换。
分区表 DML 语句中的 where 条件中推荐使用分区键。
语句需要在分区或子分区名称的周围加上括号。示例如下:
obclient> SELECT * FROM tbl1_l2 PARTITION(p2,p3); +------+------+ | col1 | col2 | +------+------+ | 8 | 8 | | 9 | 9 | +------+------+ 2 rows in set语句对数据的修改效果只有在提交事务时才永久生效。单个 DML 语句也可以是一个事务。
不带条件更新的时候,如果记录数达到几十万或者几百万,会有大事务产生,可能会失败。
UPDATE 要注意控制修改的行数,确保事务不要太大。
DELETE 语句的 WHERE 条件子句是可选的,如果没有提供 WHERE 条件子句就全表删除。如果记录数达到几十万或者几百万,会形成大事务,可能会有性能问题。建议带上 WHERE 条件分批删除,或者使用 TRUNCATE TABLE 语句。
在业务 cache 表场景中,比如频繁 insert 或 delete,数据生命周期较短的场景,需要添加 HINT 指定查询。
OceanBase 数据库对于这种场景做了 row purge 的优化,可以回收 delete 节点,提升查询性能;考虑业务场景多样性,为防止存在 row purge 无法回收的场景导致性能下降,因此推荐业务方指定 HINT 查询。
删除或更新 SQL 需优化,核心规则是粒度尽量小(不大于 100 条)且 where 条件建议有索引以便检索。
TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少,但 TRUNCATE 无事务,有可能造成事故,故建议在开发代码中使用此语句时,谨慎操作,确保无误。
说明
TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同。