Цю сторінку перекладено машинним перекладом. Читайте англійський оригінал. 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