Presto работает медленнее, чем SQL Server

Настроил соединитель SQL Server в Presto и попробовал несколько простых запросов, например:

Select count(0) from table_name

or,

Select sum(column_name) from table_name

Оба вышеуказанных запроса выполнялись на сервере SQL за 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}

person Neo    schedule 20.11.2018    source источник


Ответы (2)


Оба примера запросов представляют собой агрегированные запросы, которые производят результат в одну строку. В настоящее время в Presto невозможно передать агрегирование в базовое хранилище данных. Условия и выбор столбцов (сужение прогнозов) сдвигаются вниз, а агрегаты - нет.

В результате, когда вы запрашиваете SQL Server из Presto, Presto необходимо прочитать все данные (из заданного столбца), чтобы выполнить агрегирование, поэтому существует большой дисковый и сетевой трафик. Кроме того, может случиться так, что SQL Server может оптимизировать определенные агрегации, поэтому он может вообще пропускать чтение данных (я предполагаю здесь).

Presto не подходит для работы с какой-либо другой базой данных. Его можно использовать как таковое, но это имеет некоторые последствия. Presto великолепен, когда он используется в качестве механизма запросов больших данных (через S3, HDFS или другие хранилища объектов) или в качестве механизма федеративных запросов, где вы объединяете данные из нескольких хранилищ данных / коннекторов.

Редактировать. В Presto постоянно ведется работа над улучшением раскрытия, в том числе агрегированного. Вы можете отслеживать его на https://github.com/prestosql/presto/issues/18

person Piotr Findeisen    schedule 20.11.2018

Presto не поддерживает агрегатные выталкивания, но в качестве обходного пути вы можете создавать представления в исходной базе данных (в вашем случае SQL Server) и запрашивать эти представления из Presto.

person burak emre    schedule 23.11.2018