Deze pagina is automatisch vertaald. Lees het Engelse origineel. English

IBSurgeon-bibliotheek

Hoe het aantal records in de tabel te schatten met behulp van de statistiekwaarde van de unieke index

Firebird heeft voor elke index een speciale parameter, genaamd “indexstatistieken”.

Voor unieke indices wordt de waarde van de statistieken berekend als 1 gedeeld door het aantal unieke sleutels in een index, bijvoorbeeld voor 100 records zijn de statistieken 1/100 = 0,01.

Intern gebruikt Firebird deze waarde om de kwaliteit van de specifieke index te schatten (d.w.z. om deze wel of niet te gebruiken in het plan voor de query).

Deze waarde wordt bewaard in de kolom RDB$STATISTICS in de systeemtabel RDB$INDICES, dus als u de naam van de index kent, kunt u deze ophalen.

Als deze index uniek is (in dit geval is het de primaire sleutel), kunnen we de statistiekwaarde gebruiken om het geschatte aantal records te verkrijgen

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

Zoals u kunt zien, verschilt het aantal records van de waarde die met de statistieken is berekend, vanwege afronding.

We kunnen echter statistieken gebruiken om snel het aantal records in de tabellen te schatten en de grootste te identificeren, bijvoorbeeld:

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