在Presto中配置了SQL Server连接器,并尝试了一些简单的查询,例如:
Select count(0) from table_name
或
Select sum(column_name) from table_name
以上两种查询均在300毫秒内在SQL Server中运行,并在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}
答案 0 :(得分:1)
两个示例查询都是产生单行结果的聚合查询。 当前,在Presto中无法将聚合下推到基础数据存储。条件和列选择(缩小的预测)被下推,但聚合没有被下推。
因此,当您从Presto查询SQL Server时,Presto需要读取所有数据(从给定列中)以进行聚合,因此存在大量磁盘和网络流量。另外,可能是SQL Server可以优化某些聚合,因此它可能根本跳过了读取的数据(我在这里猜测)。
Presto不适合作为某些其他数据库的前端。可以原样使用它,但这有一定的含义。当Presto作为大数据查询引擎(通过S3,HDFS或其他对象存储)或联合查询引擎(您在其中组合来自多个数据存储/连接器的数据)使用时,它会大放异彩。
答案 1 :(得分:1)
Presto不支持聚合下拉菜单,但是作为一种变通办法,您可以在源数据库(在您的情况下为SQL Server)中创建视图,然后从Presto中查询这些视图。