Esta página fue traducida automáticamente. Lee el original en inglés. English

Biblioteca de IBSurgeon

Cómo estimar el número de registros en la tabla utilizando el valor de estadísticas del índice único

Firebird tiene un parámetro especial para cada índice, llamado “estadísticas del índice”.

Para índices únicos, el valor de las estadísticas se calcula como 1 dividido por el número de claves únicas en un índice, por ejemplo, para 100 registros las estadísticas serán 1/100 = 0.01.

Internamente, Firebird utiliza este valor para estimar la calidad del índice específico (es decir, para usarlo o no en el plan de la consulta).

Este valor se mantiene en la columna RDB$STATISTICS de la tabla del sistema RDB$INDICES, por lo que, si conoces el nombre del índice, puedes recuperarlo.

Si este índice es único (en este caso es la clave primaria), podemos usar el valor de las estadísticas para obtener el número aproximado de registros

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

Como puedes ver, el número de registros difiere del valor calculado con las estadísticas, debido al redondeo.

Sin embargo, podemos usar las estadísticas para estimar rápidamente el número de registros en las tablas e identificar las más grandes, por ejemplo:

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