Подтвердить что ты не робот

Количество строк в таблице Oracle по счету (*) vs NUM_ROWS из DBA_TABLES

Похоже, что счетчик (*) работает медленнее, чем NUM_ROWS. Могут ли эксперты в этой области немного осветить это.

4b9b3361

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

Вообще говоря, всегда лучше подсчитывать количество строк в таблице, а затем полагаться на системные таблицы.