如何利用唯一索引的统计值估算表中的记录数
Firebird为每个索引都有一个特殊参数,称为“索引统计信息”。
对于唯一索引,统计信息的值计算方式为1除以索引中唯一键的数量,例如对于100条记录,统计信息将为1/100 = 0.01。
在内部,Firebird使用此值来估计特定索引的质量(即,在查询计划中是否使用该索引)。
此值保存在系统表RDB$INDICES的RDB$STATISTICS列中,因此,如果您知道索引的名称,就可以检索它。
如果该索引是唯一的(在这种情况下它是主键),我们可以使用统计信息值来获取记录的大致数量
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