sql >> Database teknologi >  >> RDS >> Oracle

Oracle rækkeantal af tabel efter antal(*) vs. NUM_ROWS fra DBA_TABLES

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.

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

  2. 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 tilpasset estimate_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.




  1. 3 måder at finde ud af, om en kolonne er en beregnet kolonne i SQL Server

  2. PRAGMA table_list i SQLite

  3. Bestemmelse af placering af relevant tnsnames.ora fil

  4. Algoritme til at undgå SQL-injektion på MSSQL Server fra C#-kode?