10.2.4 SQL执行本地化
MergeServer包含SQL执行模块MS-SQL,ChunkServer也包含SQL执行模块CS-SQL,那么,如何区分二者的功能呢?多表操作由MergeServer执行,对于单表操作,OceanBase设计的基本原则是尽量支持SQL计算本地化,保持数据节点与计算节点一致,也就是说,只要ChunkServer能够实现的操作,原则上都应该由它来完成。
●TableScan:每个ChunkServer扫描各自子表范围内的数据,由MergeServer合并 ChunkServer返回的部分结果。
●Filter:对基本表的过滤集成在TableScan操作符中,由ChunkServer完成。对分组后的结果执行过滤(Having)集成在GroupBy操作符中,一般情况下由MergeServer完成;但是,如果能够确定每个分组的所有数据行只属于同一个子表,比如SQL请求只涉及一个tablet,那么,分组以及分组后的过滤操作符可以由ChunkServer完成。
●Projection:对基本表的投影集成在TableScan操作符中,由ChunkServer完成,对最终结果的投影由MergeServer完成。
●GroupBy:如果SQL读取的数据只在一个子表上,那么由该子表所在的 ChunkServer完成分组操作;否则,每台ChunkServer各自完成部分数据的分组操作,执行聚合运算后得到部分结果,再由MergeServer合并所有ChunkServer返回的部分结果,对于属于同一个分组的数据再次执行聚合运算。某些聚合运算需要做特殊处理,比如avg,需要转化为sum和count操作发送给ChunkServer,MergeServer合并ChunkServer返回的部分结果后计算出最终的sum和count值,并通过sum/count得到avg的最终结果。
●Sort:如果SQL读取的数据只在一个子表上,那么由该子表所在的ChunkServer完成排序操作;否则,每台ChunkServer各自完成部分数据的排序,并将排好序的部分数据返回MergeServer,再由MergeServer执行多路归并。
●Limit:Limit操作一般由MergeServer完成,但是,如果请求的数据只在一个子表上,可以由ChunkServer完成,这往往会大大减少MergeServer与ChunkServer之间传输的数据量。
●Distinct:Distinct与GroupBy类似。ChunkServer先完成部分数据的去重,再由 MergeServer进行整体去重。
例10-5 图10-2中的SQL语句为"select c1,sum(c2)from t1 where c3=10 group by c1 having sum(c2)>=10 order by c1 limit 0,20"。执行步骤如下:
1)ChunkServer调用TableScan操作符,读取子表t1中的数据,该操作符还将执行投影(Project)和过滤(Filter),返回的结果只包含c3=10的数据行,且每行只包含c1、c2、c3三列。
2)ChunkServer调用HashGroupBy操作符(假设采用基于哈希的分组算法),按照c1对数据分组,同时计算每个分组内c2列的总和sum(c2)。
3)每个ChunkServer将分组后的部分结果返回MergeServer,MergeServer将来自不同ChunkServer的c1列相同的行合并在一起,再次执行sum运算。
4)MergeServer调用Filter操作符,过滤第3)步生成的最终结果,只返回sum(c2)>=10的行。
5)MergeServer调用Sort操作符将结果按照c1排序。
6)MergeServer调用Project操作符,只返回c1和sum(c2)这两列数据。
7)MergeServer调用Limit操作符执行分页操作,只返回前20条数据。
当然,如果能够确定请求的数据全部属于同一个子表,那么,所有的物理运算符都可以由ChunkServer执行,MergeServer只需要将ChunkServer计算得到的结果转发给客户端。