#oracle #count #oracle-sqldeveloper
#Oracle #считать #oracle-разработчик sqld
Вопрос:
Существует ли простой способ получить количество строк, возвращаемых SQL-запросом Oracle?
Я пробовал count
разными способами, но ни один не сработал. Это, кажется, делает свое дело
SELECT ROWNUM, mv.* FROM my_view mv where col_a IS NOT NULL order by ROWNUM desc
но есть ли что-то простое, как nrow
в R или .shape
в Python?
Ответ №1:
SELECT count(*) over () as row_count, mv.* FROM my_view mv where col_a IS NOT NULL
даст вам подсчет, но если вы не можете быть уверены, что производительность не будет проблемой, обычно это плохая идея. Потому что что, если в таблице 1 миллиард строк, и вам нужно показать на экране только первые (скажем) 200 строк? Мы собираемся посетить все ряды кандидатов, чтобы определить это количество.
Вот почему в поиске Google указано «Результаты 1..20 из ПРИМЕРНО …»
Комментарии:
1. Привет, Коннор, спасибо за ответ. Это был хороший совет. Однако мне просто было интересно, какой наилучшей практикой было бы проверить размер представления, например, когда вам нужно сделать перекрестную ссылку на размер запроса в другом источнике. То есть мне не нужно отображать весь вид целиком, а нужно только знать количество строк.
2. Для любого заданного запроса, просто выполнив «выберите количество(*) из ( вашего запроса)», вы получите количество строк, которые вернутся…..но старайтесь этого не делать 🙂
3. Привет, Коннор, спасибо за твой ответ. Могу я спросить, почему это не поощряется?
4. Показывать людям общее количество строк-значит напрашиваться на неприятности по мере увеличения вашей таблицы. Они будут жаловаться, когда вы будете вынуждены удалить его, когда считать их станет непрактично
Ответ №2:
Мне просто было интересно, как лучше всего было бы проверить размер представления ( … ), мне не нужно отображать все представление целиком, мне нужно только знать количество строк.
В таком случае, count(*)
похоже, это правильный способ сделать это. Чисто и просто
SELECT count(*) FROM my_view WHERE col_a IS NOT NULL;
(Вы использовали order by
предложение; оно обещает быть медленнее, чем запрос без него.)
В качестве альтернативы, если бы это была таблица (а не представление), вы могли бы использовать действительно быстрый вариант — запрос user_tables
:
SQLgt; SELECT num_rows 2 FROM user_tables 3 WHERE table_name = 'EVID'; NUM_ROWS ---------- 808757
Сколько строк на самом деле в этой таблице?
SQLgt; SELECT COUNT (*) FROM evid; COUNT(*) ---------- 808761 SQLgt;
Не совсем то же самое. Почему? Потому что вы должны собирать статистику:
SQLgt; EXEC DBMS_STATS.gather_table_stats('SJERV', 'EVID'); PL/SQL procedure successfully completed.
Теперь эти значения совпадают:
SQLgt; SELECT num_rows 2 FROM user_tables 3 WHERE table_name = 'EVID'; NUM_ROWS ---------- 808761 SQLgt;
Это просто означает, что вы должны регулярно собирать статистику (схему) — например, ежедневно. Тогда у вас была бы довольно подробная информация о количестве строк. Но, чтобы быть уверенным, сколько строк у вас на самом деле, еще раз — select count(*)
.