有关B树索引中不同值的最大数量的琐碎问题

时间:2019-06-13 20:13:00

标签: sql oracle indexing oracle12c b-tree-index

我正在尝试学习索引。我查看了工作中数据库中使用的实际索引。

我查看了两个随机索引:

SELECT
INDEX_NAME, INDEX_TYPE, LEAF_BLOCKS, DISTINCT_KEYS 
FROM ALL_INDEXES
WHERE TABLE_NAME = 'TRANS'
AND INDEX_NAME IN ('TRANS_PK','TRANS_ORD_NO')

这给出了:

INDEX_NAME  | INDEX_TYPE | LEAF_BLOCKS | DISTINCT_KEYS |
TRANS_PK    | NORMAL     | 13981       |    3718619    | 
TRANS_ORD_NO| NORMAL     | 17052       |    43904      |

这对我来说毫无意义;不应该从实际表中区分出来(column_name)产生相同的数字?不是!

SELECT COUNT(DISTINCT ORD_NO) FROM trans

.. gives 20273

TRANS_PK是名为NO的列的索引。

SELECT COUNT(distinct NO) FROM trans

...给出4328622

我什么都不来?选择不重复的结果应该与ALL_INDEXES-表中的“不同的键”-列的编号相同吗?

3 个答案:

答案 0 :(得分:3)

字典视图(包括ALL_INDEXES)没有实时数据,但是新的统计值在分析时间内会刷新,并随着时间的流逝而变得陈旧。

答案 1 :(得分:0)

也在此处检查:https://www.wmata.com/service/status/#lines-affected “每个索引行都包含一个键值和一个指向B树中的中间级页面或索引的叶级中的数据行的指针。” -因此,除了数据指针之外,您还具有许多跨层叶子。

答案 2 :(得分:0)

可以使用DBMS_STATS.GATHER_INDEX_STATS()过程来收集索引统计信息。下面的示例显示了在插入行和收集索引统计信息之后如何更新DISTINCT_KEYS值。请注意,默认情况下,Oracle对索引中的数据百分比进行采样,因此DISTINCT_KEYS可能无法反映索引中不同键的实际数量。请参阅下面链接中的estimate_percent参数。

https://docs.oracle.com/database/121/ARPLS/d_stats.htm#ARPLS68575

SQL> CREATE TABLE foo AS SELECT LEVEL id FROM dual CONNECT BY LEVEL <= 5;

Table FOO created.

SQL> CREATE INDEX foo_idx ON foo(id);

Index FOO_IDX created.

SQL> SELECT * FROM foo;

        ID
----------
         1
         2
         3
         4
         5

SQL> SELECT distinct_keys FROM all_indexes WHERE table_name = 'FOO';

DISTINCT_KEYS
-------------
            5

SQL> INSERT INTO foo VALUES(6);

1 row inserted.

SQL> INSERT INTO foo VALUES(7);

1 row inserted.

SQL> COMMIT;

Commit complete.

SQL> 
SQL> SELECT distinct_keys FROM all_indexes WHERE table_name = 'FOO';

DISTINCT_KEYS
-------------
            5

-- Here's where we gather the statistics
SQL> EXECUTE DBMS_STATS.GATHER_INDEX_STATS('MYSCHEMA', 'FOO_IDX');

PL/SQL procedure successfully completed.

SQL> SELECT distinct_keys FROM all_indexes WHERE table_name = 'FOO';

DISTINCT_KEYS
-------------
            7