2009-06-02 3 views
1

私の目的は、特定の従業員のDeptNamesをEmpテーブルから取得することです。しかし、従業員の数は様々です。以下のアプローチが正しいか、以下のアプローチのどちらがパフォーマンスが良いかを教えてください。それとももっと良い方法がありますか?どのアプローチがパフォーマンス面で優れていますか? (JDBCのプリペアドステートメントでの可変パラメータマーカーの使用に関して)

PreparedStatement pstmt = conn.prepareStatement("SELECT Dept from Emp WHERE EmpNum = ? "); 
    for (int i = 0, len = empNumberList.size(); i < len; i++) { 
     pstmt.setLong (1, empNumberList.get(i)); 
     ResultSet rs = pstmt.executeQuery(); 
    } 

それとも

StringBuffer buffer = new StringBuffer(); 
buffer.append("SELECT Dept from Emp WHERE EmpNum IN(?"); 
for (int i = 0, len = empNumberList.size(); i < len; i++) { 
    buffer.append(",?"); 
} 
buffer.append(")"); 
PreparedStatement pstmt = con.prepareStatement(buffer.toString()); 
for(int i = 0; i < len; i++) { 
pstmt .setLong(i, empNumberList.get(i)); 
} 
ResultSet rs = pstmt .executeQuery(); 

それともこれを行うには、他のより良い方法はありますか?ご意見をお聞かせください。前もって感謝します!

Ravilla

答えて

0

私は

が言う "Empとは異なる部門を選択する場所EMPNUM IN(" +クエリ+ ")"

その後、setLong()sが最善のアプローチとなりをやっておそらく最高のパフォーマンスですが、パフォーマンスを確認する唯一の方法は、それをプロファイルすることです。

2

一般に、1つのクエリを実行すると、いくつかのクエリが実行されるため、ほとんどの(単純な)クエリではサーバーのラウンドトリップが大きなコストと見なされるためです。

つまり、データベースベンダーのJDBCやドライバは、そのように渡すことができるパラメータの数を制限して、そのことに注意する必要があります。

他のポスターが言ったように、クライアントでフィルタする必要はありません。この桁でDISTINCTを使用してください。

0

おそらく、通常はデータベースクエリの2番目のオプションに時間がかかります。私は二つ目は、おそらく速くなるという推計に同意

StringBuffer buffer = new StringBuffer(); 
buffer.append("SELECT Dept from Emp WHERE EmpNum IN(?"); 
for (int i = 1, len = empNumberList.size(); i < len; i++) { // one ? was written 
    buffer.append(",?"); 
} 
buffer.append(")"); 
PreparedStatement pstmt = con.prepareStatement(buffer.toString()); 
for(int i = 0; i < len; i++) { 
pstmt .setLong(i+1, empNumberList.get(i)); // pstmt setXXX() are 1 based 
} 
ResultSet rs = pstmt .executeQuery(); 
0

はまた、あなたのコードにバグがあります。

しかし、あなたが本当に知りたいのは、ベンチマークです。パフォーマンス結果はしばしば直感的ではなく、プラットフォーム、データベース、アーキテクチャ、およびバージョンによって異なります。それで自分で試してみて、違いを測る。

関連する問題