Според документацията 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, за да разберете броя на редовете в таблица. Въпреки това , и това е голямо обаче, ако някой процес вмъкне или изтрие редове от вашата таблица, това в най-добрия случай ще бъде добро приближение и в зависимост от това дали вашата база данни събира статистически данни автоматично може да бъде ужасно погрешно.
Най-общо казано, винаги е по-добре действително да преброите броя на редовете в таблицата, вместо да разчитате на системните таблици.