Tato stránka byla strojově přeložena. Přečtěte si anglický originál. English

Knihovna IBSurgeon

Jak odhadnout počet záznamů v tabulce pomocí statistické hodnoty unikátního indexu

Firebird má pro každý index speciální parametr, který se nazývá „index statistics“ (statistiky indexu).

Pro unikátní indexy se hodnota statistik vypočítá jako 1 děleno počtem unikátních klíčů v indexu, např. pro 100 záznamů bude statistika 1/100 = 0,01.

Interně Firebird používá tuto hodnotu k odhadu kvality konkrétního indexu (tj. zda jej použít či nepoužít v plánu dotazu).

Tato hodnota je uložena ve sloupci RDB$STATISTICS v systémové tabulce RDB$INDICES, takže pokud znáte název indexu, můžete ji získat.

Pokud je tento index unikátní (v tomto případě se jedná o primární klíč), můžeme použít hodnotu statistik k získání přibližného počtu záznamů.

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

Jak vidíte, počet záznamů se liší od hodnoty vypočítané pomocí statistik, a to kvůli zaokrouhlování.

Můžeme však použít statistiky k rychlému odhadu počtu záznamů v tabulkách a identifikovat ty největší, například:

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