本文介绍在 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 个之内,注意 in 最大个数 8192,否则报错 size overflow。
-
不推荐读锁
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 行)的排序、分组放到程序端实现。
-
在设置并行数的时候,最佳并行数为该表的分片数。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70026124/viewspace-2932845/
,如需转载,请注明出处,否则将追究法律责任。