このページは機械翻訳されています。英語の原文をお読みください。 English

IBSurgeon ライブラリ

一意インデックスの統計値を使用してテーブルのレコード数を推定する方法

Firebirdには、各インデックスに「インデックス統計」と呼ばれる特別なパラメータがあります。

一意インデックスの場合、統計値はインデックス内の一意キーの数で1を割った値として計算されます。例えば、100レコードの場合、統計値は1/100 = 0.01となります。

内部的には、Firebirdはこの値を使用して特定のインデックスの品質を推定します(つまり、クエリのプランでそのインデックスを使用するかどうかを判断します)。

この値はシステムテーブルRDB$INDICESのRDB$STATISTICS列に保持されているため、インデックス名がわかっていれば取得できます。

このインデックスが一意である場合(この場合は主キー)、統計値を使用しておおよそのレコード数を取得できます。

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