Tablodaki kayıt sayısı, benzersiz indeksin istatistik değeri kullanılarak nasıl tahmin edilir?
Firebird’in her indeks için “indeks istatistikleri” adında özel bir parametresi vardır.
Benzersiz indeksler için, istatistik değeri 1’in indeksteki benzersiz anahtar sayısına bölünmesiyle hesaplanır, örn. 100 kayıt için istatistik 1/100 = 0.01 olacaktır.
Dahili olarak Firebird, bu değeri belirli indeksin kalitesini tahmin etmek için kullanır (yani, sorgu planında kullanılıp kullanılmayacağını belirlemek için).
Bu değer, RDB$INDICES sistem tablosundaki RDB$STATISTICS sütununda tutulur; bu nedenle, indeksin adını biliyorsanız onu alabilirsiniz.
Bu indeks benzersizse (bu durumda birincil anahtardır), yaklaşık kayıt sayısını elde etmek için istatistik değerini kullanabiliriz:
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
Gördüğünüz gibi, kayıt sayısı, yuvarlama nedeniyle istatistiklerle hesaplanan değerden farklıdır.
Ancak, tablolardaki kayıt sayısını hızlıca tahmin etmek ve en büyükleri belirlemek için istatistikleri kullanabiliriz, örneğin:
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