在 R 中从 oracle 数据库读取数据的更快方法

Faster way to read data from oracle database in R

我有以下情况:

library(RODBC)
channel <- odbcConnect("ABC", uid="DEF", pwd="GHI")
df <- sqlQuery(channel,query)

行数为10M+。有没有更快的读取数据的方法?

数据在oracle数据库中。

这绝对应该是一条评论,但对于目的来说太长了。

执行时 SQL 有一些可能的瓶颈

  1. 正在执行查询本身
  2. 从数据库下载数据
  3. 转换数据以符合语言特定类型(例如 R 整数而不是 BIGINT

如果您的查询直接在数据库上执行时运行速度很快 UI,执行查询本身时不太可能出现瓶颈。如果您的查询仅包含简单的 [RIGHT/LEFT/INNER/OUTER] JOIN,这一点也很明显,因为它们本身并不是“复杂”的查询运算符。这通常是由使用 WITH clauses or window functions. The solution here would be to create a VIEW 的更复杂的嵌套查询引起的,这样查询将是 pre-optimized.
现在更可能是问题 2. 和 3. 你声明你的 table 有 10M 数据点。假设你的 table 是金融的,只有 5 列,都是 8 位浮点数( FLOAT(8) )或 8 位整数,要下载的数据量是 (8 * 5 * 10 M / 1024^3) Gbit = 0.37 Gbit,它本身会根据您的连接情况,需要一些时间来下载。假设您有一个 10 Mbit 的连接,在最佳条件下下载至少需要 37 秒。这是您的数据只有 5 列的情况!你有更多的可能性不大。
现在是 3。如果不仔细分析代码,就更难预测花费的时间。这是 RODBCodbcRJDBC 必须将数据转换为 R 可以理解的类型的步骤。我很遗憾地说,这里变成了一个“反复试验”的问题,以确定哪些包最有效。但是对于 oracle 的细节,我认为 DBI + odbc + ROracle(似乎是由 oracle 自己开发的??)对于一个好的竞争者来说是一个相当安全的选择。

但是请记住,将数据从任何数据库导入 R 所花费的总时间是上述措施的总和。一些数据库提供了将 queries/tables 下载为 flat-files(csv、parquet 等)的优化方法,这在某些情况下可以显着加快查询速度,但代价是必须从磁盘读取。与执行查询本身相比,这通常也变得更加复杂,因此必须评估是否值得麻烦,或者是否值得等待原始查询在 R 中完成执行。