Количество строк не соответствует для аналогичного запроса в oracle

#oracle #oracle11g

#Oracle #oracle11g

Вопрос:

Я хочу проверить количество строк каждой таблицы в моей производственной базе данных oracle. Итак, я запускаю 2 запроса для своих целей тестирования.

1) select owner, table_name, num_rows
from all_tables
where OWNER = 'XYZ' and TABLE_NAME = 'Application'
order by table_name asc;

2) select count(*) from XYZ.Application

Итак, для первого запроса я получаю результат как 829 для первого запроса. В то время как для второго запроса это 836. Итак, кто-нибудь может помочь мне понять, что мне нужно проверить, чтобы выявить это несоответствие?

Большое спасибо, ребята, за ваш ответ. Я хотел бы знать, как мы можем получить точное количество строк для всех таблиц в одном запросе?

Ответ №1:

ALL_TABLES.NUM_ROWS это число, которое Oracle собрал в качестве статистики. Это может быть оценка. Или это может быть точным, но устаревшим.

Ни в коем случае нельзя смотреть на это и делать вывод, что вы видите точное количество строк, которые в данный момент находятся в таблице.

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

Ответ №2:

Первый запрос from all_tables основан на статистике, которая не обязательно является актуальной или абсолютно точной.

Второй запрос фактически сканирует сами данные таблицы и подсчитывает строки. Он всегда будет точным.

Ответ №3:

Посмотрите на LAST_ANALYZED столбец ALL_TABLES . Это последний раз, когда статистика была собрана. Это может не отражать самое текущее состояние таблицы.

Ответ №4:

NUM_ROWS отражает только зафиксированные транзакции. С другой стороны, COUNT (*) включает в себя не зафиксированные транзакции из сеанса, в котором выполняется запрос COUNT (*). Вы только что ВСТАВИЛИ семь строк, но еще не зафиксировали их?