Esta página foi traduzida por máquina. Leia o original em inglês. English

Biblioteca IBSurgeon

Como estimar o número de registros na tabela usando o valor de estatísticas do índice único

Firebird possui um parâmetro especial para cada índice, chamado “estatísticas do índice”.

Para índices únicos, o valor das estatísticas é calculado como 1 dividido pelo número de chaves únicas em um índice, por exemplo, para 100 registros as estatísticas serão 1/100 = 0,01.

Internamente, o Firebird usa esse valor para estimar a qualidade do índice específico (ou seja, para usá-lo ou não no plano da consulta).

Esse valor é mantido na coluna RDB$STATISTICS na tabela do sistema RDB$INDICES, portanto, se você souber o nome do índice, poderá recuperá-lo.

Se esse índice for único (neste caso, é a chave primária), podemos usar o valor das estatísticas para obter o 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 você pode ver, o número de registros difere do valor calculado com as estatísticas, devido ao arredondamento.

No entanto, podemos usar as estatísticas para estimar rapidamente o número de registros nas tabelas e identificar as maiores, por exemplo:

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