首批通过分布式安全可靠测评,为关键业务系统打造
SELECT 语句编写规范
更新时间:2025-01-06 14:36:06
本文介绍在 OceanBase 中进行数据库 SELECT 语句的编写规范。
SELECT 语句推荐指定具体字段名称,禁止写成 "*"。
增加查询分析器解析成本。
增减字段容易与 resultMap 配置不一致。
推荐去掉 SELECT 无用列:SQL 语句的 SELECT 部分只写必要的列,因为多余的列会导致数据库产生回表(进入数据页获取请求的特定列),导致更多的 I/O。
使用到分区表的 SQL 语句,其谓词中都必须带上分区键。
不推荐使用
count(列名)或count(常量)来替代count(*),count(*)是 SQL92 定义的标准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关。说明
count(*)会统计值为 NULL 的行,而count(列名)不会统计此列为 NULL 值的行。SELECT 语句非必要不使用 UNION,推荐使用 UNION ALL,并且 UNION 子句个数限制在 5 个以内。
说明
UNION 最后会自动执行一个排序来消除重复,但实际上不同的查询之间通常不存在重复。
不推荐使用 in 操作,带 in 的子查询尽量改写成 join。若实在无法避免,需要仔细评估 in 后边的集合元素数量,建议控制在 100 个之内。
不推荐读锁
SELECT ... for update (with cs)。如果事务较大,高并发下容易导致锁等待影响业务。禁止使用非同类型的列进行等值查询。
说明
若字段类型为 varchar,where 条件中字段内容为 int,存在隐式转换问题,无法走索引进而可能拖垮数据库。
order by 查询语句中,order by 的字段必须唯一或者组合唯一(非唯一字段排序,OceanBase 数据库与 MySQL 表现不一致)。
不推荐核心业务流程 SQL 包含计算操作、多表关联、表遍历 case when 等复杂查询,建议拆分成单表简单查询。
对于查询条件过滤性差的 SQL,应急处理为 SQL 绑定执行计划,长期使用推荐修改 SQL 逻辑。过多的 HINT 会对后续升级维护带来一定的影响。
有 distinct、order by 和 group by 子句的查询,中间结果集限制 10000 行以内,对于大结果集(中间结果集超过 10000 行)的排序、分组放到程序端实现。
在设置并行数的时候,最佳并行数为该表的分片数。
在
WHERE条件中不建议对表字段进行算术运算和函数计算。避免在 SQL 中对变量进行赋值,尤其是在分布式处理时将结果赋值给变量。
SQL 语句中条件字段的数据类型必须保持一致,避免隐式类型转换。
SQL 语句中的
SELECT投影字段禁止使用数据库保留字。