gpt4 book ai didi

java - 使用 Oracle jdbc 的 Apache Drill 查询速度极慢

转载 作者:搜寻专家 更新时间:2023-11-01 03:17:54 68 4
gpt4 key购买 nike

我已经使用 Oracle 的 JDBC 客户端(来自 oracle 的最新 ojdbc7.jar)成功地设置了 Apache Drill(最新的 1.9)作为存储插件:

{
"type": "jdbc",
"driver": "oracle.jdbc.driver.OracleDriver",
"url": "jdbc:oracle:thin:@server:1521/myservicename",
"username": "TEST_USER",
"password": "password",
"enabled": true
}

我可以进行查询,但即使是最简单的事情也确实需要几分钟才能执行。查询单行表需要 78 秒。只需设置默认架构就需要一分钟多的时间:

0: jdbc:drill:zk=local> use oracle.TEST_USER
. . . . . . . . . . . > ;
+-------+-------------------------------------------------+
| ok | summary |
+-------+-------------------------------------------------+
| true | Default schema changed to [oracle.TEST_USER] |
+-------+-------------------------------------------------+
1 row selected (77,5 seconds)

但我已经用一个简单的 hello-world 风格的 java 应用程序进行了测试,使用相同的连接字符串的连接工作得非常好,整个表的获取时间大约为 0.1 秒。

jdbc:oracle:thin:@server:1521/myservicename

我已经在 Ubuntu 和 Mac 上进行了测试,还尝试为 java 设置随机源,因为其他答案指出了潜在的性能问题:

export DRILL_JAVA_OPTS="$DRILL_JAVA_OPTS -Djava.security.egd=file:/dev/./urandom"

这是怎么回事?这是一个已知问题还是有一些解决方法?

我用过 drill-embedded。

最佳答案

我找到了这个问题的根本原因。

问题不是慢查询,而是Drill元数据查询中的非最优预取策略。在我的例子中,数据库很大,每数百个表都有数千个模式(oracle 用户)。 Oracle 默认的 fetchsize 为 10,导致数百次数据库往返。

每个 Apache Drill JDBC 查询都在检查元数据。

内部Apache Drill: JdbcStoragePlugin.java#L351 :

java.sql.DatabaseMetaData.getSchemas()

内部Apache Calcite (Drill dependency): JdbcMeta.java#L323 :

java.sql.DatabaseMetaData.getTables(...)

这两个部分都不会覆盖任何默认的 fetchsize,并且通过 wireshark 我可以从字面上看到包是逐步下降的,每个包只有 10 行。 (数据库服务器的延迟非常高,因为位于其他地方)

我已经通过手动调用 setFetchSize 重新编译了 Apache Drill,这大大缩短了响应时间。到目前为止我还没有修补方解石,但可能也会这样做。

总的来说,我认为在获取元数据时,还应考虑编写高性能 JDBC 代码的常规步骤,因为现实世界的场景很容易以更大的元数据结束(例如,超过 10 个表或模式)另一个想法是缓存,但我还没有在 Drill 的 JDBC 存储插件中看到任何元数据缓存。

关于java - 使用 Oracle jdbc 的 Apache Drill 查询速度极慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41814970/

68 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com