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ů.
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:
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