Trang này được dịch bằng máy. Đọc bản gốc tiếng Anh. English

Thư viện IBSurgeon

Cách ước tính số lượng bản ghi trong bảng bằng cách sử dụng giá trị thống kê của chỉ mục duy nhất

Firebird có một tham số đặc biệt cho mỗi chỉ mục, được gọi là “thống kê chỉ mục”.

Đối với các chỉ mục duy nhất, giá trị của thống kê được tính bằng 1 chia cho số khóa duy nhất trong một chỉ mục, ví dụ: với 100 bản ghi, thống kê sẽ là 1/100 = 0,01.

Bên trong, Firebird sử dụng giá trị này để ước tính chất lượng của chỉ mục cụ thể (tức là, có nên sử dụng nó trong kế hoạch cho truy vấn hay không).

Giá trị này được lưu trong cột RDB$STATISTICS trong bảng hệ thống RDB$INDICES, vì vậy, nếu bạn biết tên của chỉ mục, bạn có thể truy xuất nó.

Nếu chỉ mục này là duy nhất (trong trường hợp này nó là khóa chính), chúng ta có thể sử dụng giá trị thống kê để lấy số lượng bản ghi gần đúng

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

Như bạn có thể thấy, số lượng bản ghi khác với giá trị được tính bằng thống kê, do làm tròn.

Tuy nhiên, chúng ta có thể sử dụng thống kê để nhanh chóng ước tính số lượng bản ghi trong các bảng và xác định bảng lớn nhất, ví dụ:

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