web-dev-qa-db-fra.com

Nombre de lignes Oracle de table par nombre (*) vs NUM_ROWS à partir de DBA_TABLES

On dirait que count (*) est plus lent que NUM_ROWS. Les experts dans ce domaine peuvent-ils apporter des éclaircissements à ce sujet?.

25
Srujan Kumar Gulla

Selon la documentation NUM_ROWS est le "Nombre de lignes dans la table", je peux donc voir en quoi cela peut être source de confusion. 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. Ce sont des 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 données différentes. Vous avez besoin de deux informations supplémentaires sur NUM_ROWS.

  1. Dans la documentation, il y a un astérisque par le nom de la colonne, ce qui conduit à cette note:

    Les colonnes marquées d'un astérisque (*) ne sont renseignées que si vous collectez des statistiques sur la table avec l'instruction ANALYZE ou le package DBMS_STATS.

    Cela signifie que, sauf si vous avez rassemblé des statistiques sur la table, cette colonne ne contiendra aucune donnée.

  2. Statistiques rassemblées en 11g + avec la valeur par défaut estimate_percent, ou avec une estimation à 100%, renverra un nombre exact pour ce point dans le temps. Mais les statistiques rassemblées avant 11g, ou avec une coutume estimate_percent moins de 100%, utilise un échantillonnage dynamique et peut être incorrect. Si vous rassemblez 99,999%, une seule ligne peut être manquée, ce qui signifie que la réponse obtenue est incorrecte.

Si votre table est jamais alors il est certainement possible d'utiliser ALL_TABLES.NUM_ROWS pour connaître le nombre de lignes d'une table. Cependant , et c'est un gros problème cependant, si un processus insère ou supprime des lignes de votre table, il s'agira au mieux d'une bonne approximation et selon que votre base de données rassemble automatiquement les statistiques pourrait être horriblement faux.

En règle générale, il est toujours préférable de compter le nombre de lignes de la table plutôt que de compter sur les tables système.

22
Ben