Presto 运行 比 SQL 服务器慢
Presto running slower than SQL Server
在 Presto 中配置了 SQL 服务器连接器,并尝试了一些简单的查询,例如:
Select count(0) from table_name
或者,
Select sum(column_name) from table_name
以上两个查询 运行 在 SQL 服务器中用了 300 毫秒,在 Presto 中 运行 超过 3 分钟。
这是第二个查询的解释分析(它似乎在做求和之前做了 table 扫描并获取大量数据),为什么它不能将求和运算符推到 SQL服务器本身。
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 服务器可能会优化某些聚合,因此它可能会完全跳过数据读取(我在这里猜测)。
Presto 不适合作为其他数据库的前端。它可以这样使用,但这有一些含义。当 Presto 用作大数据查询引擎(通过 S3、HDFS 或其他对象存储)或用作联合查询引擎时,它会大放异彩,您可以在其中组合来自多个数据存储/连接器的数据。
编辑 Presto 正在进行改进下推的工作,包括聚合下推。您可以在 https://github.com/prestosql/presto/issues/18
追踪它
Presto 不支持聚合下推,但作为解决方法,您可以在源数据库(SQL 服务器)中创建视图并从 Presto 查询这些视图。
在 Presto 中配置了 SQL 服务器连接器,并尝试了一些简单的查询,例如:
Select count(0) from table_name
或者,
Select sum(column_name) from table_name
以上两个查询 运行 在 SQL 服务器中用了 300 毫秒,在 Presto 中 运行 超过 3 分钟。
这是第二个查询的解释分析(它似乎在做求和之前做了 table 扫描并获取大量数据),为什么它不能将求和运算符推到 SQL服务器本身。
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 服务器可能会优化某些聚合,因此它可能会完全跳过数据读取(我在这里猜测)。
Presto 不适合作为其他数据库的前端。它可以这样使用,但这有一些含义。当 Presto 用作大数据查询引擎(通过 S3、HDFS 或其他对象存储)或用作联合查询引擎时,它会大放异彩,您可以在其中组合来自多个数据存储/连接器的数据。
编辑 Presto 正在进行改进下推的工作,包括聚合下推。您可以在 https://github.com/prestosql/presto/issues/18
追踪它Presto 不支持聚合下推,但作为解决方法,您可以在源数据库(SQL 服务器)中创建视图并从 Presto 查询这些视图。