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