Podle dokumentace je NUM_ROWS "Počet řádků v tabulce" , takže vidím, jak to může být matoucí. Mezi těmito dvěma metodami je však zásadní rozdíl.
Tento dotaz vybere počet řádků v MY_TABLE ze systémového pohledu. Toto jsou data, která Oracle dříve shromáždil a uložil.
select num_rows from all_tables where table_name = 'MY_TABLE'
Tento dotaz počítá aktuální počet řádků v MY_TABLE
select count(*) from my_table
Podle definice se jedná o rozdílová data. O NUM_ROWS potřebujete další dvě informace.
-
V dokumentaci je u názvu sloupce hvězdička, která vede k této poznámce:
Sloupce označené hvězdičkou (*) se naplní pouze v případě, že shromažďujete statistiky v tabulce pomocí příkazu ANALYZE nebo DBMS_STATSpackage.
To znamená, že pokud jste v tabulce neshromáždili statistiky, tento sloupec nebude obsahovat žádná data.
-
Statistiky shromážděné za 11g+ s výchozí hodnotou
estimate_percent
, nebo se 100% odhadem, vrátí přesné číslo pro daný časový okamžik. Ale statistiky shromážděné před 11 g nebo s vlastnímestimate_percent
méně než 100 %, používá dynamické vzorkování a může být nesprávné. Pokud nasbíráte 99,999 % jeden řádek může být vynechán, což zase znamená, že odpověď, kterou dostanete, je nesprávná.
Pokud je váš stůl nikdy aktualizován, pak je jistě možné použít ALL_TABLES.NUM_ROWS ke zjištění počtu řádků v tabulce. Nicméně , a je to velké, nicméně pokud jakýkoli proces vloží nebo odstraní řádky z vaší tabulky, bude to v nejlepším případě dobrá aproximace a v závislosti na tom, zda vaše databáze shromažďuje statistiky automaticky, může být velmi špatně.
Obecně řečeno, je vždy lepší skutečně počítat počet řádků v tabulce, než se spoléhat na systémové tabulky.