Эта страница переведена машинным переводом. Читайте английский оригинал. English

Библиотека IBSurgeon

Как оценить количество записей в таблице, используя статистическое значение уникального индекса

Firebird имеет специальный параметр для каждого индекса, называемый “статистика индекса”.

Для уникальных индексов значение статистики вычисляется как 1, деленное на количество уникальных ключей в индексе, например, для 100 записей статистика будет 1/100 = 0.01.

Внутри Firebird использует это значение для оценки качества конкретного индекса (т.е., использовать его или нет в плане запроса).

Это значение хранится в столбце RDB$STATISTICS системной таблицы RDB$INDICES, поэтому, если вы знаете имя индекса, вы можете его получить.

Если этот индекс уникален (в данном случае это первичный ключ), мы можем использовать значение статистики для получения приблизительного количества записей

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

Как вы можете видеть, количество записей отличается от значения, вычисленного со статистикой, из-за округления.

Однако мы можем использовать статистику для быстрой оценки количества записей в таблицах и определения самых больших, например:

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