Statement.executeQuery 为每个 SQL 查询花费相同的时间

Posted

技术标签:

【中文标题】Statement.executeQuery 为每个 SQL 查询花费相同的时间【英文标题】:Statement.executeQuery taking same amount of time for every SQL query 【发布时间】:2016-03-21 18:00:32 【问题描述】:

我试图通过获取连接、准备语句和执行查询来比较 2 个查询的性能。 捕获使用System.currentTimeMillis()executeQuery() 之前和之后所花费的时间。

具有讽刺意味的是,无论查询是什么,花费的时间总是相同的。(忽略第一次执行)

有人可以告诉我,如何获得查询执行的正确时间吗?

代码sn-p:

Connection conn = DriverManager.getConnection(url,"721junits","721junits");
Statement stmt = conn.createStatement();
ResultSet rs;
long startTime = System.currentTimeMillis();
rs = stmt.executeQuery(sql);
long endTime = System.currentTimeMillis();
conn.close();

System.out.println("Total time taken : "+ (endTime - startTime));

【问题讨论】:

你为什么认为你得到的数字是错误的?但是,可以肯定的是,您还应该使用返回的ResultSet。根据 JDBC 驱动程序,它可能会推迟实际执行,尽管这不太可能。 可能因为SQL执行计划相同,你的两个查询耗时相同?如果两者都导致全表扫描,您预计它们会花费相同的时间来运行。 【参考方案1】:

你应该使用 system.nanoTime()

Connection conn = DriverManager.getConnection(url,"721junits","721junits");
Statement stmt = conn.createStatement();
ResultSet rs;
long startTime = System.nanoTime();
rs = stmt.executeQuery(sql);
long endTime = System.nanoTime();
conn.close();

System.out.println("Total time taken : "+ (endTime - startTime));

阅读此answer 了解更多信息

【讨论】:

以上是关于Statement.executeQuery 为每个 SQL 查询花费相同的时间的主要内容,如果未能解决你的问题,请参考以下文章

无法从 Statement.executeQuery() 中获取选定的列

Can not issue data manipulation statements with executeQuery()的解决方案

StatementPreparedStatemntCallableStatement

Hive 查询 executeQuery() 在 java JDBC 代码中挂起

Java中带有sum的SQL语句不起作用

sql命令中的where子句