- MPP架构,数据并行化处理
-
- 垂直切分,列式存储,列存储只需要将需要查询的数据列load到内存即可,且列式存储压缩比很高,例如bigtable/hbase等列族数据存储、dremel/impala的parquet数据格式。
- 水平切分,数据sharding,newsql或者传统数仓都是这么做的,一般是基于key range。除非有大量的hotspot的查询,否则不会用hash方式。
- code gen。把查询的SQL转化为一种bytecode,然后利用利用LLVM进行目标代码优化,同事可以利用SIMD加速等。pgsql,spark,impala 有这方面的工作。
- 单机内存管理优化,抛弃JVM垃圾回收机制,自己管理管理内存;cache friendly、cache oblivious。JVM系叫做off heap memory,例如hbase的bucket cache。如果cache置换较为频繁,内存压力较大时,建议使用堆外内存方式。spark生态圈是有专门的组件alluvia来管理堆外内存。
- 分级存储,memory+ssd+sas/sata分别作为不同的级别的存储介质,热点数据放在high performance tier。Hbase的bucket cache可以配合为ssd存储。
- query predicate push down,查询谓词下推,在一个查询计划执行过程中
- 将filter谓词选择尽量放在前面步骤执行,例如大表jion,提前进行where过滤,可以有效减少中间结果集的大小,降低网络传输带宽等;
- 将聚集运算提前汇总,例如mapreduce里面的combinator就是最简单的一种;
- 其实数据存储格式中最好也包含一些 索引信息,把谓词下推到存储引擎层实现。
- data locality。数据本地化,尽量减少网络传输。例如一个大表join一个小表,将小表广播/复制到大表sharding分片所在的所