Questa pagina è stata tradotta automaticamente. Leggi l'originale in inglese. English

Libreria IBSurgeon

Come stimare il numero di record in una tabella utilizzando il valore statistico dell'indice univoco

Firebird ha un parametro speciale per ogni indice, chiamato “statistiche dell’indice”.

Per gli indici univoci, il valore delle statistiche viene calcolato come 1 diviso per il numero di chiavi univoche in un indice, ad esempio per 100 record le statistiche saranno 1/100 = 0.01.

Internamente, Firebird utilizza questo valore per stimare la qualità dell’indice specifico (cioè, per usarlo o meno nel piano della query).

Questo valore è conservato nella colonna RDB$STATISTICS nella tabella di sistema RDB$INDICES, quindi, se conosci il nome dell’indice, puoi recuperarlo.

Se questo indice è univoco (in questo caso è la chiave primaria), possiamo usare il valore delle statistiche per ottenere il numero approssimativo di record

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

Come puoi vedere, il numero di record differisce dal valore calcolato con le statistiche, a causa dell’arrotondamento.

Tuttavia, possiamo usare le statistiche per stimare rapidamente il numero di record nelle tabelle e identificare le più grandi, ad esempio:

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