Selon la documentation NUM_ROWS est le "Nombre de lignes dans la table" , donc je peux voir comment cela pourrait être déroutant. Il existe cependant une différence majeure entre ces deux méthodes.
Cette requête sélectionne le nombre de lignes dans MY_TABLE à partir d'une vue système. Il s'agit de données qu'Oracle a précédemment collectées et stockées.
select num_rows from all_tables where table_name = 'MY_TABLE'
Cette requête compte le nombre actuel de lignes dans MY_TABLE
select count(*) from my_table
Par définition, ce sont des éléments de données différents. Vous avez besoin de deux informations supplémentaires sur NUM_ROWS.
-
Dans la documentation, il y a un astérisque à côté du nom de la colonne, ce qui conduit à cette remarque :
Les colonnes marquées d'un astérisque (*) sont remplies uniquement si vous collectez des statistiques sur la table avec l'instruction ANALYZE ou le package DBMS_STATS.
Cela signifie qu'à moins que vous n'ayez rassemblé des statistiques sur le tableau, cette colonne ne contiendra aucune donnée.
-
Statistiques recueillies dans 11g+ avec la valeur par défaut
estimate_percent
, ou avec une estimation de 100 %, renverra un nombre précis pour ce moment précis. Mais statistiques recueillies avant 11g, ou avec unestimate_percent
personnalisé inférieur à 100 %, utilise un échantillonnage dynamique et peut être incorrect. Si vous obtenez 99,999 %, une seule ligne peut être manquée, ce qui signifie que la réponse que vous obtenez est incorrecte.
Si votre table est jamais mis à jour, il est certainement possible d'utiliser ALL_TABLES.NUM_ROWS pour connaître le nombre de lignes dans une table. Cependant , et c'est un grand cependant, si un processus insère ou supprime des lignes de votre table, ce sera au mieux une bonne approximation et selon que votre base de données collecte automatiquement des statistiques, cela pourrait être horriblement faux.
De manière générale, il est toujours préférable de compter le nombre de lignes dans la table plutôt que de se fier aux tables système.