Oracle 索引

索引一般分成分区索引、非分区索引、常规BTREE索引、位图索引、函数索引、哈希索引、翻转索引。

常规BTREE索引的构成结构是这样的:


Oracle <wbr>索引


有根节点块,分支节点块,叶子节点块。都是按顺序排列。

根节点和分支节点保存有索引记录,每个索引记录有两个字段,一个表示该记录的指向节点的最小值,一个字段表示连接索引块地址,该地址指向下面一个索引块。

叶子节点也有两个字段,第一个字段表示索引键值,第二个是ROWID。如果索引如果创建在非分区表上,ROWID用6个字节,分区表上的全局索引ROWID用10个字节。

PCTFREE缺省为10%,9i以后的块使用率是88%,也就是6488字节可用(8192×90%×88%)。


Oracle <wbr>索引



位图索引也是一颗平衡树。对于表里每个数据行如果索引列值不为空则会为该行在叶子节点里维护一个对应索引条目。


Oracle <wbr>索引

BTREE索引一般小表BLEVEL都是2以下,如果比较大就需要3级。

推算一下:405*405=164025个叶节点。164025*360=59049000行记录。也就是说当某个表有大于59049000行记录时,该索引就有3层了。当大于6000万记录时就应当有3层BLEVEL了。

 

理论上,利用索引访问一条记录需要访问2或3个索引块和1个数据块就可以完成,索引访问每次只能读取一个块。

 

全表扫描可以把多个连续块同时读入内存,然后从其中检索,一次读入块数可以用DB_FILE_MULTIBLOCK_READ_COUNT决定。用全表扫描方式检索成本等于:

物理读的次数=数据块数量÷每次读取数据块数量

 

 

聚簇因子(CLUSTERING_FACTOR)

DBA_INDEXES视图CLUSTERING_FACTOR反应了索引列的分布特点。

此外还有DBA_TABLES视图的AVG_ROW_LEN,

还有DB_BLOCK_SIZE一起影响CBO决策。

这几个数值这样查:

SQL>SELECT INDEX_NAME, TABLE_NAME, UNIQUENESS, BLEVEL, CLUSTERING_FACTOR FROM DBA_INDEXES;

SQL> SELECT TABLE_NAME, AVG_ROW_LEN FROM DBA_TABLES;

在索引中,索引项肯定是按照顺序保存的。如果记录在表中的顺序也是这个顺序,CLUSTERING_FACTOR就是一个较小的数值。最理想是CLUTERING_FACTOR等于DBA_TABLES.BLOCKS,也就是和表占用数据块数量相等。

对比两者数量:

SQL> SELECT A.TABLE_NAME, A.INDEX_NAME, A.CLUSTERING_FACTOR, B.BLOCKS FROM DBA_INDEXES A, DBA_TABLES B WHERE A.TABLE_NAME=B.TABLE_NAME;

一般来说

DBA_TABLES.BLOCKS <=DBA_INDEXES.CLUSTERING_FACTOR<=DBA_TABLES.NUM_ROWS

越小越好,越大越糟糕。


你可能感兴趣的:(oracle,索引,index)