2017-04-17 127 views
-1

我在Oracle JDBC中有关于setString()和setDate()的一些问题。当我尝试做一些关于setString()和setDate()的测试时,我发现在大多数情况下,setDate()比setString()更快。 有人可以帮我解释一下吗? 这里我的测试:Oracle JDBC中的setString()和setDate()的性能?

private void doSelectTest() 
{ 
    System.out.println("[OUTPUT FROM SELECT]"); 
    //String query = "SELECT LAST_NAME FROM Employees WHERE HIRE_DATE = ?"; 
    String query = "SELECT LAST_NAME FROM Employees WHERE HIRE_DATE = TO_DATE(?,'yyyy-MM-dd')"; 
    try 
    { 
     PreparedStatement st = conn.prepareStatement(query); 
     //st.setDate(1,java.sql.Date.valueOf("2003-06-17")); 
     st.setString(1,"2003-06-17"); 
     ResultSet r = st.executeQuery(); 
     System.out.println(query.toString()); 
    } 
    catch (Exception ex) 
    { 
     System.err.println(ex.getMessage()); 
    } 
} 

感谢您的帮助。

+0

请备份您的声明*“setDate()比一些数据快于setString()”*。我希望从表中读取记录的行为是表现的主要部分。如果没有'HIRE_DATE'上的索引,那就意味着全表扫描,并且这比发送参数为Date或String的性能差异要慢得多。 – Andreas

+0

您是否了解问题?我正在使用同一张表进行查询。我跳过所有涉及索引,分区等的性能。我只是想在setDate和setString中提前准备。 –

+0

是的,我理解问题,并且我期望Date和String之间的性能差别与执行查询时发生的任何其他事情相比可以忽略不计,*除非它影响访问计划,即阻止使用索引。您没有提供足够的信息来推测这一点,因此我要求提供您的声明的证据,以便我们可以看到您需要支持哪些数字。除非我们知道他们是什么,否则我们无法帮助解释您的数字。 – Andreas

回答

3

首先,我想知道你是如何在这里测量时间的。创建一个无意义的基准测试非常简单。

其次,除了“setDate”和“setString”之外,你还有很多事情要做,其中一些是客户端,另一些是服务器端。

对于您的“setDate”示例,您还在执行java.sql.Date.valueOf(“2003-06-17”)`,因此您还要测量字符串转换为日期的开销客户。

对于您的“setString”示例,您的sql语句包含“TO_DATE(?,'yyyy-MM-dd')”,因此您再次测量字符串到日期的转换,但是这次在服务器上(在数据库中)。

所以,我认为你是苹果比较橙子,可能不是很准确。

+0

谢谢。我认为这是最好的答案 –

0

A Date通常由单个long值表示。它因此可以被转换为64位。 A Stringlength加上无数字符。另外,服务器必须解析并解码它(可能是long)。