2017-04-17 123 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)。