Как оценить количество записей в таблице, используя статистическое значение уникального индекса
Firebird имеет специальный параметр для каждого индекса, называемый “статистика индекса”.
Для уникальных индексов значение статистики вычисляется как 1, деленное на количество уникальных ключей в индексе, например, для 100 записей статистика будет 1/100 = 0.01.
Внутри Firebird использует это значение для оценки качества конкретного индекса (т.е., использовать его или нет в плане запроса).
Это значение хранится в столбце RDB$STATISTICS системной таблицы RDB$INDICES, поэтому, если вы знаете имя индекса, вы можете его получить.
Если этот индекс уникален (в данном случае это первичный ключ), мы можем использовать значение статистики для получения приблизительного количества записей
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