本文介绍在 OceanBase 中进行数据库 DML 语句的编写规范。
-
INSERT 语句必须指定具体的字段名称,不要写成
INSERT VALUES(......)形式,请指定需要插入的 column_name。
-
禁止
force index、
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 语句也可以是一个事务。
-
不带条件更新的时候,如果记录数达到几十万或者几百万,会有大事务产生,可能会失败。
-
在业务 cache 表场景中,比如频繁 insert 或 delete,数据生命周期较短的场景,需要添加 HINT 指定查询。
OceanBase 数据库对于这种场景做了 row purge 的优化,可以回收 delete 节点,提升查询性能;考虑业务场景多样性,为防止存在 row purge 无法回收的场景导致性能下降,因此推荐业务方指定 HINT 查询。
-
删除或更新 SQL 需优化,核心规则是粒度尽量小(不大于 100 条)且 where 条件建议有索引以便检索。
-
TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少,但 TRUNCATE 无事务,有可能造成事故,故建议在开发代码中使用此语句时,谨慎操作,确保无误。
说明
TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70026124/viewspace-2932846/
,如需转载,请注明出处,否则将追究法律责任。