首页 > 解决方案 > 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}

标签: sql-serverpresto

解决方案


两个示例查询都是产生单行结果的聚合查询。目前,在 Presto 中,无法将聚合下推到底层数据存储。条件和列选择(缩小投影)被下推,但聚合不是。

因此,当您从 Presto 查询 SQL Server 时,Presto 需要读取所有数据(从给定列)来进行聚合,因此存在大量磁盘和网络流量。此外,SQL Server 可能会优化某些聚合,因此它可能会完全跳过数据读取(我在这里猜测)。

Presto 不适合作为其他数据库的前端。它可以这样使用,但这有一些含义。当 Presto 用作大数据查询引擎(通过 S3、HDFS 或其他对象存储)或联合查询引擎(您可以在其中组合来自多个数据存储/连接器的数据)时,它会大放异彩。

编辑Presto 正在进行一项改进下推的工作,包括聚合下推。您可以在https://github.com/prestosql/presto/issues/18跟踪它


推荐阅读