我正在尝试学习索引。我查看了工作中数据库中使用的实际索引。
我查看了两个随机索引:
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-表中的“不同的键”-列的编号相同吗?
答案 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