我尝试使用apache-drill运行简单的join-aggregate查询,速度并不是很好。我的测试查询是:
SELECT p.Product_Category, SUM(f.sales)
FROM facts f
JOIN Product p on f.pkey = p.pkey
GROUP BY p.Product_Category
其中事实有大约422,000行,产品有600行。分组返回4行。
首先,我在SqlServer上测试了这个查询,并在大约150ms内得到了一个结果。
使用钻取我首先尝试直接连接到SqlServer并运行查询,但这很慢(大约5秒)。
然后我尝试将表保存到json文件中并从中读取,但这甚至更慢,所以我尝试了镶木地板文件。
我在第一次跑步中得到了结果,大约3秒钟。下次运行大约900ms,然后稳定在大约500ms。
从阅读开始,这没有任何意义,钻孔应该更快! 我试过“REFRESH TABLE METADATA”,但速度没有改变。
我是通过钻取命令行在Windows上运行它。
我是否需要一些额外的配置?
谢谢!
答案 0 :(得分:6)
为什么期望Apache Drill在这里更快? Drill 非常快,但它专为大型分布式查询而设计,可能跨越多个不同的数据源......但您并未使用分布式数据。
SQL Server拥有数十年的代码和优化,使其成为在单个服务器上运行的最快的关系数据库之一。您的数据可以高效存储,缓存在内存中,查询可以在一个进程中运行,因此扫描和连接速度非常快,尤其是在数据量很少的情况下。
Apache Drill相比之下还有很多工作要做。它必须将您的查询解释为分布式计划,然后将其发送到所有钻取进程,然后查找数据源,使用连接器访问数据,运行查询,将结果返回到第一个节点进行聚合,然后你有最后的输出。根据数据源的不同,Drill可能必须读取所有数据并单独过滤,这会增加更多时间。
JSON文件很慢,因为它们是逐行解析的详细文本文件。 Parquet的速度要快得多,因为它是一种二进制压缩的面向列的存储格式,对扫描非常有效。
任何关系数据库都会比单机上的Drill更快。事实上,Drill让你获得500毫秒的Parquet结果,这实际上令人印象深刻,考虑到它需要做多少工作才能为你提供灵活性。如果你只有几百万行,坚持使用SQL服务器。如果您有数十亿行,则使用SQL Server列存储功能以柱状格式存储数据,并具有出色的压缩和性能。
在您执行以下操作时使用Apache Drill:
答案 1 :(得分:2)
人们需要了解Drill如何工作的一件事是Drill如何将SQL查询转换为可执行计划,从理论上讲,从任何数据源获取和处理数据。我故意不说数据源,所以人们不会想到数据库或任何基于软件的数据管理系统。
Drill使用存储插件从存储插件支持的任何数据中读取记录。
Drill获取这些行后,它会开始执行执行查询所需的操作,所需的内容可能是过滤,排序,连接,投影(选择特定列)......等等
因此,默认情况下,钻取不使用任何源处理查询数据的功能。事实上,消息来源可能不支持这种能力!
如果您希望利用任何来源的数据处理功能,您必须修改您用来访问此来源的存储插件。
当我考虑Drill的表现时,我经常记得的一个问题就是这个问题
Select a.CUST_ID, (Select count(*) From SALES.CUSTOMERS where CUST_ID < a.CUST_ID) rowNum from SALES.CUSTOMERS a Order by CUST_ID
仅仅因为&gt; 比较运算符,Drill必须加载整个表格(即实际上是镶木地板文件),排序IT ,然后执行加入。< / p>
此查询在我的计算机上运行大约需要18分钟,这是一台功能不是很强大的计算机,但仍然不能忽略Drill处理此查询所需的工作。
Drill的目的不是快速,它的目的是处理大量数据并对结构化和半结构化数据运行SQL查询。可能还有其他我目前无法思考的事情,但您可以找到更多其他答案的信息。