ITPub博客

首页 > 数据库 > 国内数据库 > 【手摸手玩转 OceanBase 134】SELECT 语句编写规范

【手摸手玩转 OceanBase 134】SELECT 语句编写规范

原创 国内数据库 作者:13579NB232 时间:2023-01-19 16:30:16 0 删除 编辑

本文介绍在 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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2023-01-18

  • 博文量
    184
  • 访问量
    93198