3

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

我查看了两个随机索引:

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

..给 20273

TRANS_PK 是名为 NO 的列的索引。

SELECT COUNT(distinct NO) FROM trans

...给出 4 328 622

我没有得到什么?选择不同的应该导致与“不同的键”相同的数字 - ALL_INDEXES 表中的列?

4

3 回答 3

3

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

于 2019-06-13T20:33:43.000 回答
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
于 2019-06-13T21:17:41.300 回答
0

还要在这里检查:https ://docs.microsoft.com/en-us/sql/relational-databases/sql-server-index-design-guide?view=sql-server-2017 “每个索引行都包含一个键值和指向 B 树中的中间级别页面或索引叶级别中的数据行的指针。” - 所以在数据指针之上,你还有许多跨级叶子。

于 2019-06-13T20:50:14.200 回答