Cette page a été traduite automatiquement. Lisez l'original en anglais. English

Bibliothèque IBSurgeon

Comment estimer le nombre d'enregistrements dans la table en utilisant la valeur statistique de l'index unique

Firebird dispose d’un paramètre spécial pour chaque index, appelé « statistiques d’index ».

Pour les index uniques, la valeur des statistiques est calculée comme 1 divisé par le nombre de clés uniques dans un index, par exemple pour 100 enregistrements, les statistiques seront 1/100 = 0,01.

En interne, Firebird utilise cette valeur pour estimer la qualité de l’index spécifique (c’est-à-dire, l’utiliser ou non dans le plan de la requête).

Cette valeur est conservée dans la colonne RDB$STATISTICS de la table système RDB$INDICES, donc, si vous connaissez le nom de l’index, vous pouvez la récupérer.

Si cet index est unique (dans ce cas, il s’agit de la clé primaire), nous pouvons utiliser la valeur des statistiques pour obtenir le nombre approximatif d’enregistrements

Code
SQL> select rdb$statistics from rdb$indices where rdb$index_name ='PK_DOC_LIST';

         RDB$STATISTICS
=======================
  1.062473558022248e-07

SQL> select 1.0/rdb$statistics from rdb$indices where rdb$index_name ='PK_DOC_LIST';

                 DIVIDE
=======================
      9411998.938227322

SQL> select count(*) from DOC_LIST;

                COUNT
=====================
              9362939

Comme vous pouvez le voir, le nombre d’enregistrements diffère de la valeur calculée avec les statistiques, en raison de l’arrondi.

Cependant, nous pouvons utiliser les statistiques pour estimer rapidement le nombre d’enregistrements dans les tables et identifier les plus grandes, par exemple :

Code
SQL> select rdb$index_name, 1/rdb$statistics from rdb$indices where rdb$index_name like 'PK%' and rdb$statistics >0  order by 2 desc;

RDB$INDEX_NAME                                   DIVIDE
=============================== =======================
PK_DOC_LIST                           9411998.938227322
PK_PERF_ESTIMATED                     26190.00023190827
PK_PERF_AGG                           2514.000026047463
PK_WARES                              400.0000089406969
PK_INVNT_SALDO                        400.0000089406969
PK_AGENTS                             50.00000111758712
PK_MONEY_SALDO                        49.00000100396576
PK_OPTYPES                            8.999999932944775
PK_WARE_GROUPS                        8.000000000000000
PK_SEMAPHORES                         4.999999925494195
PK_DOC_STATES                         4.000000000000000