Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用oraclejdbc的速度非常慢的apachedrill查询_Java_Oracle_Jdbc_Apache Drill - Fatal编程技术网

Java 使用oraclejdbc的速度非常慢的apachedrill查询

Java 使用oraclejdbc的速度非常慢的apachedrill查询,java,oracle,jdbc,apache-drill,Java,Oracle,Jdbc,Apache Drill,我已经成功地使用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",

我已经成功地使用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用户),每个模式有数百个表。oracles的默认fetchsize为10,导致数百DB往返

每个ApacheDrill JDBC查询都在检查元数据

内部:

内部:

这两个部分都不会覆盖任何默认的fetchsize,通过wireshark,我可以一步一步地看到每个包只包含10行。(与位于其他地方的DB服务器相比,延迟相当高)

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

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

对于那些有相同问题并试图找到答案的人

我更新了oraclejar文件
/oracle/jdbc/defaultConnectionProperties.properties

并补充说
oracle.jdbc.defaultRowPrefetch=200

我使用7zip打开和编辑文件内容

注意:您需要为您的案例找到最佳行预回迁


我阅读是为了给我一个想法。

激活Oracle 10046跟踪,查看数据库中的时间消耗情况。嗨,托马斯,你能分享需要添加到JdbcStoragePlugin.java中的确切setFetchSize代码吗?嗨,托马斯,你能分享我的补丁吗
导出钻头\u java\u选项=“$DRILLBIT\u JAVA\u OPTS-Doracle.jdbc.defaultRowPrefetch=50000”
在my drill-env.sh中
java.sql.DatabaseMetaData.getSchemas()
java.sql.DatabaseMetaData.getTables(...)