一意インデックスの統計値を使用してテーブルのレコード数を推定する方法
Firebirdには、各インデックスに「インデックス統計」と呼ばれる特別なパラメータがあります。
一意インデックスの場合、統計値はインデックス内の一意キーの数で1を割った値として計算されます。例えば、100レコードの場合、統計値は1/100 = 0.01となります。
内部的には、Firebirdはこの値を使用して特定のインデックスの品質を推定します(つまり、クエリのプランでそのインデックスを使用するかどうかを判断します)。
この値はシステムテーブルRDB$INDICESのRDB$STATISTICS列に保持されているため、インデックス名がわかっていれば取得できます。
このインデックスが一意である場合(この場合は主キー)、統計値を使用しておおよそのレコード数を取得できます。
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
ご覧のとおり、レコード数は丸めのため統計値から計算した値とは異なります。
ただし、統計を使用してテーブルのレコード数をすばやく推定し、最大のものを特定できます。例えば:
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