Похоже, что счетчик (*) работает медленнее, чем NUM_ROWS. Могут ли эксперты в этой области немного осветить это.
Количество строк в таблице Oracle по счету (*) vs NUM_ROWS из DBA_TABLES
Ответ 1
1) Получение NUM_ROWS из приведенного ниже запроса означает, что значение no.of строк обновляется DBMS_STATS. Таким образом, он не содержит текущего количества строк в таблице, но вычисляется аппроксимация последнего времени выполнения DBMS_STATS.
SELECT table_name,
num_rows
FROM dba_tables
WHERE TABLE_NAME='NAME'
Чтобы обновить последнее значение счетчика строк в представлении DBA_TABLES
выполнить
exec dbms_stats.gather_schema_stats(ownname => 'NAME');
2) count (*) вызывает вычисление no. строк из таблицы.
Ответ 2
Согласно документации NUM_ROWS - это "Количество строк в таблице", поэтому я вижу, как это может запутать. Однако существует существенное различие между этими двумя методами.
Этот запрос выбирает количество строк в MY_TABLE из системного представления. Это данные, которые Oracle ранее собирал и сохранял.
select num_rows from all_tables where table_name = 'MY_TABLE'
Этот запрос подсчитывает текущее количество строк в MY_TABLE
select count(*) from my_table
По определению они являются разностными частями данных. В NUM_ROWS есть две дополнительные части информации.
-
В документации есть звездочка по имени столбца, что приводит к этой заметке:
Столбцы, отмеченные звездочкой (*), заполняются только в том случае, если вы собираете статистика в таблице с оператором ANALYZE или DBMS_STATS пакет.
Это означает, что, если вы не собрали статистику по таблице, этот столбец не будет иметь никаких данных.
-
Статистика, собранная в 11g + со значением по умолчанию
estimate_percent
или со 100-процентной оценкой, вернет точное количество для этого момента времени. Но статистика, собранная до 11g, или с пользовательскимestimate_percent
менее 100%, использует динамическую выборку и может быть неправильной. Если вы соберете 99,999%, может быть пропущена одна строка, что, в свою очередь, означает, что полученный вами ответ неверен.
Если ваша таблица никогда не обновляется, то, безусловно, можно использовать ALL_TABLES.NUM_ROWS, чтобы узнать количество строк в таблице. Однако, но при этом большой, если какой-либо процесс вставляет или удаляет строки из вашей таблицы, он будет в лучшем случае хорошим приближением и в зависимости от того, будет ли ваша база данных автоматически собирать статистику, может быть ужасно неправильным.
Вообще говоря, всегда лучше подсчитывать количество строк в таблице, а затем полагаться на системные таблицы.