sql >> Databáze >  >> RDS >> Oracle

Oracle počet řádků tabulky podle počtu(*) vs. NUM_ROWS z DBA_TABLES

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.

  1. 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.

  2. 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ím estimate_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.




  1. SQL WHERE Více podmínek

  2. SYSUTCDATETIME() vs GETUTCDATE() na serveru SQL Server:Jaký je rozdíl?

  3. Jak Cosh() funguje v PostgreSQL

  4. Sledujte signály pomocí datového modelu zpracování signálu