ORACLE索引组织表学习(三)

2014-11-24 12:51:14 · 作者: · 浏览: 3
an.display())

------------------------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

------------------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 702 | 32292 | 122 (1)| 00:00:02 |

|* 1 | INDEX FASTFULL SCAN| SYS_IOT_TOP_84235 | 702 | 32292 | 122 (1)| 00:00:02 |

------------------------------------------------------------------------------------------

)

我们查找的字段并不是主键,然而还是走索引了,只是走的是全索引扫描。

explain plan for

select * from HEAP_TABLE t

where t.object_id=30

select * from table(dbms_xplan.display())

--------------------------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

--------------------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 1 | 44 | 2 (0)| 00:00:01 |

| 1 | TABLE ACCESS BY INDEX ROWID|HEAP_TABLE | 1 | 44 | 2 (0)| 00:00:01 |

|* 2 | INDEX UNIQUE SCAN | SYS_C0016433 | 1 | | 1 (0)| 00:00:01 |

--------------------------------------------------------------------------------------------

对比而言,我们看到组织索引表在查找某些数据(根据主键),没有出现TABLE ACCESS BY INDEX ROWID, 因此提高了查询效率。

从以上分析可以看出,索引组织表有些象普通表与单独索引组成的配置,只不过 没有维护两个单独的存储结构,数据库仅维护一个单独的 B-tree 索引。因此, 每一个索引项包含了

使用索引组织表的好处。

索引组织表通过主键或可以成为主键合法前缀的任何键提供了对表数据的 更快访问,在 B-tree 叶块中出现的非键字段避免了额外的数据块访问。同时, 由于数据行是按照主键的顺序进行存储的,对主键或合法前缀的范围扫描只涉及 到最小数据块的访问。

我们看到组织索引表示一个全新类型的表,在查询时候,我们发现由于没有TABLE ACCESS BY INDEX ROWID ,从而提高了查询的性能。oracle数据库不会提供一个全方面全天候的优化技术。了解组织索引表以及适合应用场所,就显得很有必要。

组织索引表的基本存储

我们删除一部分数据,然后再插入这部分数据,观察数据存储

HEIGHT

2

2

2

BLOCKS

512

512

512

NAME

SYS_IOT_TOP_71372

SYS_IOT_TOP_71372

SYS_IOT_TOP_71372

PARTITION_NAME

LF_ROWS

68261

68261

68261

LF_BLKS

417

417

417

LF_ROWS_LEN

3271826

3271826

3271826

LF_BLK_LEN

8000

8000

8000

BR_ROWS

416

416

416

BR_BLKS

1

1

1

BR_ROWS_LEN

4517

4517

4517

BR_BLK_LEN

8032

8032

8032

DEL_LF_ROWS

0

34110

0

DEL_LF_ROWS_LEN

0

1643446

0

DISTINCT_KEYS

68261

68261

68261

MOST_REPEATED_KEY

1

1

1

BTREE_SPACE

3344032

3344032

3344032

USED_SPACE

3276343

3276343

3276343

PCT_USED

98

98

98

ROWS_PER_KEY

1

1

1

BLKS_GETS_PER_ACCESS

3

3

3

PRE_ROWS

0

0

0

PRE_ROWS_LEN

0

0

0

OPT_CMPR_COUNT

0

0

0

OPT_CMPR_PCTSAVE

0

0

0

1、我们隔行删除一半数据记录

delete from ORG_INDEX_TABLE where mod(object_id,2) = 1;

analyze index SYS_IOT_TOP_84235 validate structure;

select * fromindex_stats

alter table ORG_INDEX_TABLE move online;

analyze index SYS_IOT_TOP_84235 validate structure;

select *from index_stats

HEIGHT

2

2

2

BLOCKS

512

512

256

NAME

SYS_IOT_T…

SYS_IOT…

SYS_IOT_...

PARTITION_NAME

LF_ROWS

70231

70231

35124

LF_BLKS

440

440

233

LF_ROWS_LEN

3350295

3350295

1667079

LF_BLK_LEN

8000

8000

8000

BR_ROWS

439

439

232

BR_BLKS

1

1

1

BR_ROWS_LEN

4757

4757

2521

BR_BLK_LEN

8032

8032

8032

DEL_LF_ROWS

0

35107

0

DEL_LF_ROWS_LEN

0

1683216

0

DISTINCT_KEYS

70231

70231

35124

MOST_REPEATED_KEY

1

1

1

BTREE_SPACE

3528032

3528032

1872032

USED_SPACE

3355052

3