1

私の目的は、Emp テーブルから特定の従業員の DeptNames を取得することです。しかし、従業員の数はさまざまです。以下のアプローチが正しいかどうか、および以下のアプローチのどれがパフォーマンスの面で優れているかを教えてください。それとも、それについてもっと良い方法がありますか?

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();

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

ラビラ

4

4 に答える 4

2

一般的に言えば、1 つのクエリを実行することは、複数のクエリを実行することよりも優先されます。これは、ほとんどの (些細な) クエリでは、サーバーの往復がかなりのコストと見なされるためです。

そうは言っても、データベース ベンダー、JDBC、またはドライバーは、その方法で渡すことができるパラメーターの数を制限している可能性があるため、注意する必要があります。

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

于 2009-06-02T10:12:04.143 に答える
0

私は、2番目のものがおそらくより速いだろうという見積もりに同意します。

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

于 2009-06-02T10:28:17.697 に答える
0

私は言うだろう

"SELECT DISTINCT Dept FROM Emp WHERE EmpNum IN (" + クエリ + ")"

その場合、setLong() を実行するのが最良のアプローチであり、おそらく最良のパフォーマンスですが、パフォーマンスを確認する唯一の方法はプロファイルを作成することです。

于 2009-06-02T10:10:07.063 に答える
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();
于 2009-06-02T10:13:20.113 に答える