分布式数据库中间件 DDM-DDM SQL使用规范:select操作

时间:2023-11-10 17:32:08

select操作

  • Order by 及 Limit函数
    • "order by limit offset, count"场景,禁止给offset赋大数值,即禁止深度翻页。
    • 如遇到临时表超限(Temp table limit exceeded)报错,说明排序中间数据产生了临时表且超限,考虑联系DDM值班进行SQL调优。
  • Group by函数
    • 不建议select_list部分含有非group by列。
    • 不支持不可下推的group_concat聚合函数内含有order by子句。
    • 不建议distinct、group by字段多于3项。
    • 不建议join、或者子查询操作之后含有group by操作
    • 不建议使用count(distinct ),sum(distinct )操作。
    • 如遇到临时表超限(Temp table limit exceeded)报错,说明聚合操作中间数据产生了临时表且超限,考虑联系DDM值班进行SQL调优。
  • Join函数
    • select场景,建议join条件是每个表的拆分字段或使用广播表,或者是驱动表是一个小表(inner/left join驱动表是左表,right join驱动表是右表)。
    • 不建议两个大表直接进行join操作。
    • 不建议join on condition中含有非等值操作。
    • 如遇到临时表超限(Temp table limit exceeded)报错,说明JOIN中间数据产生了临时表且超限,考虑联系DDM值班进行SQL调优。
    • 不建议5张表以上进行join操作。
    • join查询操作建议不要开启事务。
    • 不建议在事务中进行join查询,开启事务会影响DDM对join算法的选择,无法使用最高效的算法。

      这里的大表和小表的意思不是指原始表的规模,指的是经过where条件过滤之后的数据规模。

  • 子查询
    • 不建议子查询包含在OR表达式中,或者是子查询的关联条件包含在OR表达式中
    • 不建议使用含有limit的标量子查询,如 select (select x from t2 where t2.id= t.id limit 1),a,b from t。
    • 如果子查询和主表都路由到同一分片,建议在SQL前加/*+db=xxx*/来精准路由。
    • 不建议子查询内部含有join语句。
    • 不建议写嵌套子查询。
    • 不建议ROW表达式跟子查询做比较操作,如 select * from t where (a,b,c)=(select x,y,z from t2 where …)。
    • 不建议select_list里面含有超过2个以上的子查询 。
support.huaweicloud.com/bestpractice-ddm/ddm_01_0014.html