Блестящий медленный на Redshift

Я пытаюсь использовать Redshift для приложения Shiny после использования Postgres. До сих пор Redshift превосходил Postgres, за исключением тех случаев, когда речь шла о информационных панелях.

У меня было бы что-то подобное в global.R для извлечения моих данных

    driver <- dbDriver("PostgreSQL")
    conn <- dbConnect(driver,
                      host="myhost.rds.amazonaws.com",
                      user="user",
                      password="password",
                      port=5432,
                      dbname="my_database"
    )
  query = "select * from customers"
  res <- dbSendQuery(conn, query))
  dataframe <- fetch(res, n = -1))

Мой подход к Redshift очень похож, за исключением некоторых настроек, которые я взял из здесь

  download.file('https://s3.amazonaws.com/redshift-downloads/drivers/jdbc/1.2.12.1017/RedshiftJDBC42-1.2.12.1017.jar','RedshiftJDBC42-1.2.12.1017.jar')
  driver <- JDBC("com.amazon.redshift.jdbc42.Driver", "RedshiftJDBC42-1.2.12.1017.jar", identifier.quote="`")
  url <- "jdbc:redshift://host.redshift.amazonaws.com:5439/my_db?user=user&password=password"
  conn <- dbConnect(driver, url)
  query = "select * from customers"
  res <- dbSendQuery(conn, query))
  dataframe <- fetch(res, n = -1))

Однако, несмотря на то, что я могу выполнять запросы быстрее, когда я нахожусь внутри сеанса, для извлечения данных в фрейм данных из Redshift требуется значительно больше времени. Я не нашел ничего, устраняющего это несоответствие. Я провел несколько тестов

> test_time('redshift')
   user  system elapsed 
 30.870   7.236  21.423 
> test_time('postgres')
   user  system elapsed 
  1.877   0.595   2.577 

> test_time('redshift')
   user  system elapsed 
 31.137   7.294  22.743 
> test_time('postgres')
   user  system elapsed 
  1.900   0.520   2.466 

Однако я понял, что Postgres требует намного больше времени для выполнения dbSendQuery, в то время как Redshift был намного быстрее (но опять же, намного медленнее при извлечении результатов в фрейм данных). Вот некоторые показатели, которые я собрал

> test_time('postgres')
   user  system elapsed # dbSendQuery
  1.230   1.201  23.708 
   user  system elapsed # fetch
  1.795   0.172   2.029 
> test_time('redshift')
   user  system elapsed # dbSendQuery
  0.006   0.004   0.091 
   user  system elapsed # fetch
 32.723   8.146  23.666 

Я просто хочу понять, что происходит за капотом, из-за чего Redshift работает не так хорошо, как я ожидал. Я предполагаю, что для преобразования результатов из базы данных на основе столбцов в фрейм данных на основе строк требуется больше времени, чем из традиционной базы данных на основе строк в фрейм данных.


person Minh Mai    schedule 14.05.2018    source источник


Ответы (1)


Запрос «выберите звездочку» не является столбцовым шаблоном OLAP, на котором ожидается быстрое выполнение. Чтобы извлечь данные из столбцовой базы данных, механизм должен получить каждый отдельный столбец и материализовать (превратить в кортежи) результирующий набор. Преобразование, о котором вы упомянули, на самом деле происходит на стороне базы данных. Предполагается, что он будет работать быстро при агрегировании огромных объемов данных и возврате небольшой сводной таблицы, тогда Postgres будет намного медленнее. В то же время данные уже находятся в виде кортежей в Postgres. Итак, если ваше основное назначение серверной части базы данных — это хранилище для последующего анализа в каком-нибудь статистическом пакете, таком как R и Python, вам, вероятно, даже не нужен Redshift.

person AlexYes    schedule 15.05.2018
comment
Спасибо за понимание, да, я подумал, что это может быть так. Звезда выбора была просто примером запроса, я пробовал выбирать один, два и три столбца, и результаты все еще довольно сопоставимы. Прямо сейчас Redshift — это хранилище данных для анализа, но я также хочу, чтобы он был источником для панели инструментов и визуализаций. Похоже, у меня не может быть обоих - person Minh Mai; 15.05.2018