Firebird 고유 인덱스의 통계 값을 사용하여 테이블의 레코드 수를 추정하는 방법
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