Jak oszacować liczbę rekordów w tabeli, korzystając z wartości statystyk unikalnego indeksu
Firebird ma specjalny parametr dla każdego indeksu, nazywany „statystykami indeksu”.
Dla indeksów unikalnych wartość statystyk jest obliczana jako 1 podzielone przez liczbę unikalnych kluczy w indeksie, np. dla 100 rekordów statystyki wyniosą 1/100 = 0,01.
Wewnętrznie Firebird używa tej wartości do oszacowania jakości konkretnego indeksu (tj. czy użyć go, czy nie, w planie zapytania).
Ta wartość jest przechowywana w kolumnie RDB$STATISTICS w tabeli systemowej RDB$INDICES, więc jeśli znasz nazwę indeksu, możesz ją pobrać.
Jeśli ten indeks jest unikalny (w tym przypadku jest to klucz podstawowy), możemy użyć wartości statystyk, aby uzyskać przybliżoną liczbę rekordów
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 widać, liczba rekordów różni się od wartości obliczonej na podstawie statystyk, ze względu na zaokrąglenia.
Możemy jednak użyć statystyk, aby szybko oszacować liczbę rekordów w tabelach i zidentyfikować największe, na przykład:
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