为什么Drill连接查询未针对Mongo DB进行全面优化?

时间:2016-11-04 08:42:19

标签: mongodb performance join sql-execution-plan apache-drill

我正在研究概念验证,以优化通过钻取执行的连接查询的性能。底层存储是基于NO-SQL的数据库 - Mongo DB。返回连接查询结果所需的时间为46秒。经过进一步分析,根据查询的物理计划,观察到左侧(150万条记录)和右侧表格(130万条)都被完全扫描,分别需要24秒和20秒。

以下是查询:

select ta.[SOME_COLUMN]  
from mongo.Test.TABLEA ta  
INNER JOIN mongo.Test.TABLEB ta ON ta.Id = tb.Id and ta.Id ='123'
  • 表A中的记录:150万

  • 表B中的记录:130万

过滤条件:Id是两个表中的索引字段(升序)

钻取计划显示正在执行散列连接:

enter image description here

  1. 为什么钻取所有记录到内存中,即使为其中一个表提供了索引列的过滤条件?在mongo级别,我观察到执行了集合扫描而不是索引扫描,这背后的原因是什么? (鉴于我的连接和过滤条件适用于索引列)
  2. 如果Drill规划器/优化器足够智能,那么基于连接条件也可以在第二个表上过滤记录(以减少数据集,从而缩短执行时间).MongoDB存储插件不是完全优化导致这个?

1 个答案:

答案 0 :(得分:2)

Drill的MongoDB存储插件不支持下推连接。它仅支持按下过滤器。

存储插件负责与Drill支持的数据源进行通信。

如果您愿意,您必须提供自己的优化规则以下推联接。这将需要Apache Calcite经验并编写一个新的存储插件来提供这些规则。

我不知道是否有其他方式可以提供新规则,除非有自定义插件。该插件不应该处理MongoDB,它只需要提供必要的规则。