Задать вопрос
vanesxl
@vanesxl

Как узнатьсколько строк вернул запрос?

Здравствуйте, написал простую программу, которая должна просто узнать сколько записей в бд по определенному запросу, вот что у меня есть:
public class Main {
    public static void main(String[] args) {
        try {
            DriverManager.registerDriver(new Driver());
            Connection c = DriverManager.getConnection("jdbc:mysql://host/dbname", "login", "pass");
            
            Statement s = c.createStatement();
            ResultSet rez = s.executeQuery("SELECT id FROM chel");
            
            
            
            
        } catch (SQLException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Подскажите пожалуйста как узнать сколько строк возвращается по моему запросу?
Заранее большое спасибо!
  • Вопрос задан
  • 3341 просмотр
Подписаться 1 Оценить 1 комментарий
Решения вопроса 3
EugeneP2
@EugeneP2
Java Dev
Никак не узнать.

Или перед основным запросом выполнить SELECT count(*) FROM TABLE
Ответ написан
Комментировать
grumblik
@grumblik
В меру любопытен и разумно пытлив
Тут два пути. Первый получить с помощью SQL запроса - точно верный метод.
И получить с помощью подсчёта строк полученных из запроса - не всегда верный метод(только при маленьком наборе данных).

Сейчас объясню почему:
Представьте, что у вас таблица на 100 000 000 000 строк.
Вы делаете запрос и получаете в результате 10 000 000 000 строк.
Допустим все эти строки вам нужны в программе (пользователь в форме на сайте глюканул и запросил все данные за последние 10 лет). Но вы сначала проверяете с помощью count(*) сколько вернулось строк.

Очевидные плюсы - ваша программа не вылетит потому, что вы получаете всего одно значение, а не 10 000 000 000(И соответственно можете не допустить выгрузки такого большого количества данных которые подвесят вашу систему - что то типа if result > 10 000 then return "Слишком много данных"). Во вторых анализатор SQL вполне возможно обойдётся внутренней статистикой, а не проходом по индексам (или если совсем не повезёт фул тейбл сканом, что даже на миллионой таблице может сильно затормозить). В любом случае при использовании count мы не наблюдаем падения производительности, а в хорошем случае наблюдаем её прирост.

А теперь представим, что вам нужно сделать отчет, вы знаете SQL запрос который вернёт нужные значения, но вы не знаете сколько строк он вернёт. RAM на вашей машине ограничен. Есть вариант, что программа сожрёт всю доступную память и уйдёт в своп(или упадёт если она 32'ух битная и приложению максимум выделяется 1,5 Гб) если заранее не проверить сколько данных мы запихнём в программу. Поэтому нужно перед выгрузкой данных проверить сколько у нас получится этих данных.

По этому самый лучший вариант сначала "SELECT COUNT(*) FROM chel", а потом уже "SELECT <какие-то_столбцы> FROM chel".
Это будет правильно. Ну и старайтесь избегать подзапросов там где без них можно обойтись.

PS это облегчит жизнь и вам и DBA которые будут сопровождать вашу БД.
С уважением админ как раз одной такой большой БД у которого программисты периодически пишут косячный SQL
Ответ написан
@CybernatiC
Веб-разработчик
Надо count(*) from table_name

Примерно будет такое

s.executeQuery("SELECT (SELECT COUNT(*) FROM chel) as count,id FROM chel");
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы