在使用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的表现不如我预期的那么好。我的假设是,将基于列的数据库的结果转换为基于行的数据帧需要更多的时间,而不是传统的基于行的数据库到数据帧。
答案 0 :(得分:2)
&#34;选择明星&#34;查询不是预期快速执行的柱状OLAP模式。要从列式数据库中提取数据,引擎需要获取每一列并实现结果集(转换为元组)。您提到的转换实际上发生在数据库端。它应该在聚合大量数据并返回一个小的汇总表时快速工作,这在Postgres会慢得多的时候会发生。与此同时,数据已经成为Postgres中的元组。因此,如果您对数据库后端的主要指定是在R和Python等统计软件包中进行后续分析的存储,那么您可能甚至不需要Redshift。