7.3 查询设计最佳实践

1. 尽可能多地使用筛选条件

  • HybridDB可以对任意列做过滤(一般建表通过index_all='Y'声明默认全索引),所以用户使用不需要考虑组合索引、谓词顺序和数量等问题,尽量多做筛选
  • 过滤条件尽量使用折叠好了的谓词,如ds='2017-01-01'而不是ds=date('2017-01-01')。可能会出现没有提前折叠掉的常量,影响性能

2. Join使用的指导原则

  • 采用事实表与维度表Join,会有很高的性能
  • Join的两张表尽量按一级分区键作为join key,会有很高的性能
  • 如果有非一级分区的列要join,那最好增加where条件减少参与join的数据量
  • 如果有非一级分区的列要join,要考虑join倾斜问题,如果是否有过多的null值
  • 如果有其他非一级分区的列要join,最好也能带上一级分区键一起join,即多个join key,其中包含一级分区键
  • 如果出现一级分区键不对齐和对齐混合的多个join,为了性能最佳,尽量把其中分区键对齐的join写在一起,分区键不对齐的写在一起。
  • right outer join尽量rewrite成left outer join
  • Join的where条件里第一级谓词是OR,并且cond1 OR cond2里面的条件有左表也有右表的,业务上考虑rewrite成join where cond1 union all join where cond2形式,性能更好
  • outer join的on和where作用域不同。on是作用于join过程中的,where是作用于join之后的结果的,所以能在join的时候提前过滤的条件推荐写在on上,也可以写在join表的子查询里,可以减少join原始表的数据量

3. 避免分区倾斜

  • HybridDB是一款分布式数据库,所以在做join、group by时一定会遇到分区倾斜的情况,这时首先检查有没有Null值和无效值。如果确实某些key特别大时,可以考虑改成union来实现。如: ```java 某几个Key的数据量特别大(单个并发处理单个Key都比较困难),而另外一张表对应的数据量很小: 分拆Join的目的就是把倾斜的keys捞出来,单独计算,比如: select A.id from A join B on A.id = B.id 如果key为1的数据量特别大,经过改写后: select A.id from A join B on A.id = B.id where A.id <> 1; select A.id from A join B on A.id = B.id where A.id = 1 and B.id = 1; 化为两个join,然后再union起来。

```

results matching ""

    No results matching ""