【发布时间】:2019-11-14 04:28:53
【问题描述】:
在 SQLDeveloper 中运行或通过直接 JDBC 运行时,相同的选择具有完全不同的性能。结果只有一行。
SQLDeveloper 0.035 秒 SqlDeveloper Screenshot
JDBC 16 秒。 JDBC Screenshot
我在同一台机器上并连接到同一个数据库。 Oracle JDBC驱动的版本是ojdbc6 11.2.0.3。
如果我将参数更改为按长主键进行过滤,则代码运行速度很快。这两列都被索引了。
表定义Screenshot
我已经尝试过更改oracle驱动版本,同样的问题发生了。
Connection conn = DriverManager.getConnection(url, "xxxx", "xxxx");
PreparedStatement preparedStatement = null;
ResultSet rs = null;
try {
System.out.println("Connected to database");
String consultaSQL = "SELECT SE.ID_SAIDA_ESTOQUE, SE.DATA_ULTIMA_ATUALIZACAO, "
+ "SE.SITUACAO_VENDA, SE.ID_CLIENTE, SE.ID_ENTRADA_ESTOQUE_TROCA, SE.UUID, SE.ID_OPERACAO_MOVIMENTO, SE.ID_SETOR_ESTOQUE, SE.ID_EMPRESA, SE.ID_TERMINAL "
+ "FROM EST_SAIDA_ESTOQUE SE WHERE SE.UUID = ?"
preparedStatement = conn.prepareStatement(consultaSQL);
preparedStatement.setQueryTimeout(40);
preparedStatement.setString(1, "000001c8-38d5-47c8-8e19-980c0c66e183");
//preparedStatement.setLong(1, 230998);
rs = preparedStatement.executeQuery();
【问题讨论】:
-
它只返回一行。
-
您的consultaSQL 示例字符串似乎被截断了。你能编辑和更正吗?您还可以发布带有数据类型的表定义吗?
-
完成@OldProgrammer
-
如果您在
consultaSQL字符串中硬编码UUID 并注释掉setString会发生什么?我问的原因是您的两个测试非常不同:您的 JDBC 示例使用绑定变量,而 SQLDeveloper 示例使用文字。 Oracle 优化器绝对可以区别对待它们。绑定变量是首选,但为了快速测试,请尝试使用文字来查看 JDBC 性能是否更好。 -
为了帮助您查看正在使用的计划,请尝试在 JDBC 查询中在
SELECT之后添加/* JDBC1 */ /*+ gather_plan_statistics */,在 SQL Developer 中在SELECT之后添加/* SQLDEV1 */ /*+ gather_plan_statistics */。这将更容易找到运行的确切 SQL 语句(通过分别使用JDBC1或SQLDEV1搜索 SQL 文本),并将帮助您获得在这两个地方使用的确切计划。我认为如果你能看到两者都在使用真正的查询计划,那将是一件好事。如果事实证明两者的计划哈希相同,则强烈表明它不是数据库。