apache钻不好表现

Imb*_* M. 15 performance parquet apache-drill

我尝试使用apache-drill运行简单的连接聚合查询,速度不是很好.我的测试查询是:

SELECT p.Product_Category, SUM(f.sales)
FROM facts f
JOIN Product p on f.pkey = p.pkey
GROUP BY p.Product_Category
Run Code Online (Sandbox Code Playgroud)

事实有大约422,000行,产品有600行.分组返回4行.

首先,我在SqlServer上测试了这个查询,并在大约150ms内得到了一个结果.

使用钻取我首先尝试直接连接到SqlServer并运行查询,但这很慢(大约5秒).

然后我尝试将表保存到json文件并从中读取,但这甚至更慢,所以我尝试了镶木地板文件.

我在第一次运行中得到了结果,大约3秒钟.下次运行大约900ms,然后稳定在大约500ms.

从阅读来看,这没有任何意义,钻孔应该更快!我试过"REFRESH TABLE METADATA",但速度没有变化.

我通过钻取命令行在Windows上运行它.

如果我需要一些额外的配置或什么的任何想法?

谢谢!

Man*_*ham 8

你为什么期望Apache Drill在这里更快?钻非常快的,但它专为大型分布式查询,可能跨越几个不同的数据来源......但你不使用分布式数据.

SQL Server拥有数十年的代码和优化,使其成为在单个服务器上运行的最快的关系数据库之一.您的数据可以高效存储,缓存在内存中,查询可以在一个进程中运行,因此扫描和连接速度非常快,特别是对于这么少的数据.

相比之下,Apache Drill还有很多工作要做.它必须将您的查询解释为分布式计划,然后将其发送到所有钻取进程,然后查找数据源,使用连接器访问数据,运行查询,将结果返回到第一个节点进行聚合,然后你有最后的输出.根据数据源的不同,Drill可能必须读取所有数据并单独过滤,这会增加更多时间.

JSON文件很慢,因为它们是逐行解析的详细文本文件.Parquet速度更快,因为它是一种二进制压缩的列式存储格式,对扫描非常有效.

任何关系数据库都比单机上的Drill更快.事实上Drill可以让你获得500毫秒的Parquet结果,这实际上令人印象深刻,考虑到它需要做多少工作才能为你提供灵活性.如果你只有几百万行,坚持使用SQL服务器.如果您有数十亿行,则使用SQL Server列存储功能以柱状格式存储数据,并具有出色的压缩和性能.

您执行以下操作时使用Apache Drill:

  • 有(10s)数十亿行或更多
  • 数据分布在许多机器上
  • 将非结构化数据(如JSON)存储在没有标准模式的文件中
  • 想要跨多台计算机拆分查询以将其并行化并运行得更快
  • 想要访问来自不同数据库和文件系统的数据
  • 想要跨这些不同的数据源加入数据