Ta strona została przetłumaczona maszynowo. Przeczytaj oryginał angielski. English

Biblioteka IBSurgeon

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

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

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