2017-04-17 10 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

問題を理解しましたか?私はクエリに同じテーブルを使用しています。私は、インデックス、パーティションなどに関連するすべてのパフォーマンスをスキップします。私はprepareDateとsetStringにpreparestatementを要求したいだけです。 –

+0

はい、私は問題を理解し、 'Date'と' String'のパフォーマンスの差は、アクセスプランに影響を与えない限り、つまりクエリの実行時には何も起こりません。インデックス。あなたはそれを仮定するのに十分な情報を与えていないので、あなたの主張の証明のための私の要求は、あなたがそれをバックアップしなければならない数字を見ることができます。私たちが何をしているのか分からない限り、あなたの数字を説明するのは本当に助けにはなりません。 – Andreas

答えて

3

まず、ここで実際にタイミングをどのように測定しているのだろうか。意味のないベンチマークを作成するのは本当に簡単です。

第2に、ちょうど "setDate"と "setString"の他に、クライアント側とその一部のサーバー側の部分がたくさんあります。

"setDate"の例では、java.sql.Date.valueOf( "2003-06-17") `も実行しているので、文字列を日付に変換する際のオーバーヘッドも測定しています。クライアント。

"setString"の例では、SQL文に "TO_DATE(?、 'yyyy-MM-dd')"が含まれているため、文字列の日付への変換を測定していますが、 -side(データベース内)。

私はあなたがリンゴとオレンジを比較していると思いますが、あまり正確ではないと思います。

+0

ありがとうございます。私はこれが最高の答えだと思う –

0

Dateは、通常、単一のlong値で表されます。したがって、64ビットとして転送することができます。 Stringは、lengthに複数の文字を加えたものです。さらに、サーバーはそれを解析してデコードする必要があります(恐らくlong)。

関連する問題