Блестящий медленный на Redshift - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь использовать 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))

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

> 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 работать не так, как я ожидал. Я предполагаю, что для преобразования результатов из столбчатой ​​базы данных в ряд данных на основе строки требуется больше времени, чем из традиционной базы данных на основе строк в кадр данных.

1 Ответ

0 голосов
/ 15 мая 2018

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

...