对于数据库来说,Push Query to Data 和 Pull Data to Query 并不是非此即彼的选择,在不同类型的分布式数据库、不同的查询执行阶段上,也有可能使用不同的执行模式。
Example #1: Push Query to Data in Shared-Nothing Architecture
如上图所示:应用程序将查询请求发到上方的节点,称为节点 A。节点 A 发现 ID 在 1-100 之间的数据就在本地存储;而 ID 在 101-200 之间的数据位于下方的节点,称为节点 B。因此节点 A 将查询发给节点 B,由节点 B 负责将 101-200 之间的数据 join,然后将 join 的结果返回给节点 A,而节点 A 则自行将 1-100 之间的数据 join,最终节点 A 将所有数据整理好返回给应用程序。整个过程对应用程序透明。
Example #2: Pull Data to Query in Shared-Disk Architecture
如上图所示:在 shared-disk 架构下,节点 A 可以将计算分散到不同的节点上,如 1-100 的在 A 节点上计算;101-200 的在 B 节点上计算。A,B 拿到计算任务后,就将各自所需的数据 (page ABC、XYZ) 从共享的存储服务中取出放到本地。这个取数据的过程就是 Pull Data to Query。当 B 节点中的计算任务执行完后,B 节点将结果返回给 A 节点,A 节点再将自己的结果与 B 节点的结果结合,得到最终的结果返回给应用程序:
后面这步又有点类似 Push Query to Data,因此我们需要注意 Push 和 Pull 并不是在一次查询执行过程中只能取其一,也可能是一种混合过程。