Redshift上的闪亮缓慢

时间:2018-05-14 21:45:21

标签: r database shiny amazon-redshift

在使用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的表现不如我预期的那么好。我的假设是,将基于列的数据库的结果转换为基于行的数据帧需要更多的时间,而不是传统的基于行的数据库到数据帧。

1 个答案:

答案 0 :(得分:2)

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

相关问题