【发布时间】:2018-05-14 21:45:21
【问题描述】:
在使用 Postgres 后,我正在尝试将 Redshift 用于 Shiny 应用程序。到目前为止,除了仪表板之外,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 的方法非常相似,除了我从 here 进行的一些调整
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 性能不如我预期的幕后情况。我的假设是,将结果从基于列的数据库转换为基于行的数据帧比从传统的基于行的数据库转换为数据帧需要更多的时间。
【问题讨论】:
标签: r database shiny amazon-redshift