JDBCで行数を取得するにはどうすればよいですか?
質問
結果セットを取得するためにJDBCクエリを実行しました。繰り返す前に、返された行数をすばやく見つけたいと思います。どうすれば高いパフォーマンスでこれを行うことができますか?
Java 6、Oracle 11g、および最新のOracle JDBCドライバーを使用しています。
解決
これを別のクエリとして実行する必要があります。例:
SELECT COUNT(1) FROM table_name
JDBCドライバーによっては通知される場合がありますが、これはオプションの動作であり、さらに重要なことに、ドライバーはまだ知らない場合があります。これは、クエリの最適化方法が原因である可能性があります。たとえば、Oracleの2つの実行戦略の例では、すべての行をできるだけ早く取得するか、最初の行をできるだけ早く取得します。
2つの別個のクエリ(1つはカウント、もう1つはクエリ)を実行する場合、同じトランザクション内で実行する必要があります。これはOracleでは問題なく動作しますが、他のデータベースでは問題が発生する可能性があります(たとえば、SQL Serverは分離レベルに応じてコミットされていないデータを表示するか、外部のコミットされていない更新をブロックしますが、Oracleはトランザクションの一貫したビューを提供する分離レベルをサポートします外部更新をブロックしないデータ)。
通常、行の数は実際には関係ありません。通常、この種のクエリはバッチ処理またはページングされ、ロード/処理された行の形式で進行状況情報を取得し、結果セットの終わりを検出できます(明らかに)。
他のヒント
ResultSet rs = stmt.executeQuery(sql);
int rowCount = rs.last() ? rs.getRow() : 0; // Number of rows in result set. Don't forget to set cyrsor to beforeFirst() row! :)
簡単な答え:できません。
長答:できません。データベースがクエリを遅延評価し、要求された行のみを返す可能性があるためです。
編集:スクロール可能なResultSetを使用すると、次のことができます:)
実際、私はずっと前に(2001年に!)Javaデータベースニュースグループでこの質問をしましたが、役立つ回答。
JDBCから行数を取得するには:
ResultSet rs = st.executeQuery("select count(*) from TABLE_NAME");
rs.next();
int count = rs.getInt(1);
ドライバーがサポートしている場合(!)、ResultSet.afterLast()ResultSet.getRow()ResultSet.beforeFirst()を呼び出すことができます。パフォーマンスは良い場合も悪い場合もあります。
より良い解決策は、サイズを事前に要求しないようにアルゴリズムを書き直すことです。
三項演算子なし
rs.last(); // Moves the cursor to the last row in this ResultSet object.
int rowCount = rs.getRow(); //Retrieves the current row number.
rs.beforeFirst(); //Moves the cursor to the front of this ResultSet object,just before the first row.
三項演算子を使用して1行
int rowCount = rs.last() ? rs.getRow() : 0;
rs.beforeFirst();
コード:
//Create a Statement class to execute the SQL statement
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT COUNT(*) AS COUNT FROM
TABLENAME");
while(rs.next()) {
System.out.println("The count is " + rs.getInt("COUNT"));
}
//Closing the connection
con.close();