Ifølge dokumentationen er NUM_ROWS "Antal rækker i tabellen" , så jeg kan se, hvordan det kan være forvirrende. Der er dog en stor forskel mellem disse to metoder.
Denne forespørgsel vælger antallet af rækker i MY_TABLE fra en systemvisning. Dette er data, som Oracle tidligere har indsamlet og gemt.
select num_rows from all_tables where table_name = 'MY_TABLE'
Denne forespørgsel tæller det aktuelle antal rækker i MY_TABLE
select count(*) from my_table
Per definition er de forskellige stykker data. Der er to yderligere oplysninger, du har brug for om NUM_ROWS.
-
I dokumentationen er der en stjerne ved kolonnenavnet, som fører til denne note:
Kolonner markeret med en stjerne (*) udfyldes kun, hvis du samler statistik på tabellen med ANALYZE-sætningen eller DBMS_STATSpackage.
Det betyder, at medmindre du har samlet statistik på tabellen, vil denne kolonne ikke have nogen data.
-
Statistik indsamlet i 11g+ med standardværdien
estimate_percent
, eller med et estimat på 100 %, vil returnere et nøjagtigt tal for det pågældende tidspunkt. Men statistik indsamlet før 11g, eller med en tilpassetestimate_percent
mindre end 100 %, bruger dynamisk sampling og kan være forkert. Hvis du samler 99,999%, kan en enkelt række gå glip af, hvilket igen betyder, at det svar, du får, er forkert.
Hvis dit bord er aldrig opdateret, så er det bestemt muligt at bruge ALL_TABLES.NUM_ROWS til at finde ud af antallet af rækker i en tabel. Men , og det er et stort, men hvis en proces indsætter eller sletter rækker fra din tabel, vil det i bedste fald være en god tilnærmelse, og afhængigt af om din database indsamler statistik automatisk, kan det være grueligt forkert.
Generelt er det altid bedre at tælle antallet af rækker i tabellen i stedet for at stole på systemtabellerne.