#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 (*). Вы только что ВСТАВИЛИ семь строк, но еще не зафиксировали их?