sql-server - Presto 运行速度比 SQL Server 慢
问题描述
在 Presto 中配置 SQL Server 连接器,并尝试了一些简单的查询,例如:
Select count(0) from table_name
或者,
Select sum(column_name) from table_name
上述两个查询在 SQL Server 中运行了 300 毫秒,在 Presto 中运行了 3 分钟以上。
这是对第二个查询的解释分析(它似乎在进行求和之前进行表扫描并获取大量数据),为什么它无法将求和运算符下推到 SQL Server 本身。
Query Plan
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Fragment 1 [SINGLE]
Cost: CPU 2.98ms, Input: 1 row (9B), Output: 1 row (9B)
Output layout: [sum]
Output partitioning: SINGLE []
- Aggregate(FINAL) => [sum:double]
Cost: ?%, Output: 1 row (9B)
Input avg.: 1.00 lines, Input std.dev.: 0.00%
sum := "sum"("sum_4")
- LocalExchange[SINGLE] () => sum_4:double
Cost: ?%, Output: 1 row (9B)
Input avg.: 0.06 lines, Input std.dev.: 387.30%
- RemoteSource[2] => [sum_4:double]
Cost: ?%, Output: 1 row (9B)
Input avg.: 0.06 lines, Input std.dev.: 387.30%
Fragment 2 [SOURCE]
Cost: CPU 1.67m, Input: 220770667 rows (1.85GB), Output: 1 row (9B)
Output layout: [sum_4]
Output partitioning: SINGLE []
- Aggregate(PARTIAL) => [sum_4:double]
Cost: 0.21%, Output: 1 row (9B)
Input avg.: 220770667.00 lines, Input std.dev.: 0.00%
sum_4 := "sum"("total_base_dtd")
- TableScan[sqlserver:sqlserver:table_name:ivpSQLDatabase:table_name ..
Cost: 99.79%, Output: 220770667 rows (1.85GB)
Input avg.: 220770667.00 lines, Input std.dev.: 0.00%
total_base_dtd := JdbcColumnHandle{connectorId=sqlserver, columnName=total_base_dtd, columnType=double}
解决方案
两个示例查询都是产生单行结果的聚合查询。目前,在 Presto 中,无法将聚合下推到底层数据存储。条件和列选择(缩小投影)被下推,但聚合不是。
因此,当您从 Presto 查询 SQL Server 时,Presto 需要读取所有数据(从给定列)来进行聚合,因此存在大量磁盘和网络流量。此外,SQL Server 可能会优化某些聚合,因此它可能会完全跳过数据读取(我在这里猜测)。
Presto 不适合作为其他数据库的前端。它可以这样使用,但这有一些含义。当 Presto 用作大数据查询引擎(通过 S3、HDFS 或其他对象存储)或联合查询引擎(您可以在其中组合来自多个数据存储/连接器的数据)时,它会大放异彩。
编辑Presto 正在进行一项改进下推的工作,包括聚合下推。您可以在https://github.com/prestosql/presto/issues/18跟踪它
推荐阅读
- docker - 如何使用 runc 列出 docker 容器
- node.js - 如何在同一网络上运行 docker-compose 和 docker?
- javascript - 计算 SVG 地图上点之间的纬度/经度和距离
- python - Django模型方法变量放入模板
- javascript - jQuery模态关闭函数,在关闭时清除值,需要排除特定的命名输入
- reactjs - 从签名的 S3 URL 获取数据:`不存在 'Access-Control-Allow-Origin' 标头`
- r - 将 RMarkdown 编入工作文档时出错,可能是由于安装了软件包
- java - Java在FileWriter中获取文件名
- java - 我如何使用 xpath 使用 if else 语句
- asp.net - 找到更新用户角色的代码,但不显示 [HttpGet] 方法或 ViewPage