Diese Seite wurde maschinell übersetzt. Lesen Sie das englische Original. English

IBSurgeon-Bibliothek

So schätzen Sie die Anzahl der Datensätze in der Tabelle mithilfe des Statistikwerts des eindeutigen Index

Firebird verfügt über einen speziellen Parameter für jeden Index, der “Index-Statistik” genannt wird.

Für eindeutige Indizes wird der Wert der Statistik als 1 geteilt durch die Anzahl der eindeutigen Schlüssel in einem Index berechnet, z. B. beträgt die Statistik für 100 Datensätze 1/100 = 0,01.

Intern verwendet Firebird diesen Wert, um die Qualität des jeweiligen Index zu schätzen (d. h., ob er im Ausführungsplan für die Abfrage verwendet werden soll oder nicht).

Dieser Wert wird in der Spalte RDB$STATISTICS in der Systemtabelle RDB$INDICES gespeichert. Wenn Sie also den Namen des Index kennen, können Sie ihn abrufen.

Wenn dieser Index eindeutig ist (in diesem Fall handelt es sich um den Primärschlüssel), können wir den Statistikwert verwenden, um die ungefähre Anzahl der Datensätze zu ermitteln:

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

Wie Sie sehen können, weicht die Anzahl der Datensätze aufgrund von Rundungen von dem mit der Statistik berechneten Wert ab.

Wir können die Statistik jedoch verwenden, um die Anzahl der Datensätze in den Tabellen schnell zu schätzen und die größten zu identifizieren, zum Beispiel:

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