此页面为机器翻译。请阅读英文原文。 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