Вопрос

Я выполнил запрос JDBC, чтобы получить результирующий набор.Прежде чем повторить это, я хотел бы быстро выяснить, сколько строк было возвращено.Как я могу сделать это с высокой производительностью?

Я использую Java 6, Oracle 11g и новейшие драйверы Oracle JDBC.

Это было полезно?

Решение

Вам нужно будет сделать это отдельным запросом, например:

SELECT COUNT(1) FROM table_name

Некоторые драйверы JDBC могут сказать вам, но это необязательное поведение, и, более того, драйвер может еще не знать. Это может быть связано с тем, как оптимизируется запрос, например, две примерные стратегии выполнения в Oracle должны получить все строки как можно быстрее или получить первую строку как можно быстрее.

Если вы выполняете два отдельных запроса (один - счетчик, а другой - запрос), вам необходимо выполнить их в рамках одной транзакции. Это будет хорошо работать в 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, вы можете:)

Действительно, я задал этот самый вопрос в группе новостей баз данных Java давным-давно (еще в 2001 году!), и у меня было несколько полезные ответы .

Чтобы получить количество строк из 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.

С троичным оператором в одну строку

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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top