Redshift上的闪亮缓慢

Posted

技术标签:

【中文标题】Redshift上的闪亮缓慢【英文标题】:Shiny slow on Redshift 【发布时间】: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 性能不如我预期的幕后情况。我的假设是,将结果从基于列的数据库转换为基于行的数据帧比从传统的基于行的数据库转换为数据帧需要更多的时间。

【问题讨论】:

【参考方案1】:

“选择星号”查询不是一种列式 OLAP 模式,它有望快速执行。要从列式数据库中提取数据,引擎需要获取每一列并具体化(变成元组)结果集。您提到的转换实际上发生在数据库端。当聚合大量数据并返回一个小的汇总表时,它应该工作得很快,那时 Postgres 会慢得多。同时,数据已经作为元组存在于 Postgres 中。因此,如果您对数据库后端的主要指定是用于在 R 和 Python 等统计包中进行后续分析的存储,您可能甚至不需要 Redshift。

【讨论】:

感谢您的洞察力,是的,我认为可能是这种情况。 “选择星”只是一个示例查询,我已经尝试选择一、二和三列,结果仍然相当可比。现在 Redshift 是用于分析的数据仓库,但我也希望它成为仪表板和可视化的来源。看来我不能两者兼得

以上是关于Redshift上的闪亮缓慢的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Pentaho 处理 Amazon Redshift 中缓慢变化的维度?

我可以在 RedShift 中创建快速插入暂存表吗?

Redshift UPDATE 非常慢

EMR 上的 spark-redshift 连接超时异常

如何使用 redshift 上的函数插入表格

Redshift:DateDiff 调用上的 SqlAlchemy 错误