堆表特点

Heap Table就是一般的表,获取表中的数据是按命中率来得到的。没有明确的先后之分,在进行全表扫描的时候,并不是先插入的数据就先获取。数据的存放也是随机的,当然根据 可用空闲的空间来决定。

堆表和索引表的区别

堆表其索引中记录了记录所在位置的rowid,查找的时候先找索引,然后再根据索引rowid找到块中的行数据, 索引组织表,其行数据以索引形式存放,因此找到索引,就等于找到了行数据
1 堆组织表,其索引中记录了记录所在位置的rowid,查找的时候先找索引,然后再根据索引rowid找到块中的行数据。索引和表数据是分离的。
2 索引组织表,其行数据以索引形式存放,因此找到索引,就等于找到了行数据。索引和数据是在一起的。
3 堆组织表的存储速度因为不用考虑排序, 所以存储速度会比较快,但是要查找符合某个条件的记录, 就必须得读取全部的记录以便筛选,而这个时候为了加快查询速度, 索引就出现了, 索引是针对少量特定字段的值拿出来进行排序存储, 并记录在表中的位置, 而因为索引是有序的, 所以就会很容易通过索引查询到具体的记录位置, 然后再 根据记录位置直接从表中读取该记录,同时因为索引的字段较少, 所以索引通常会比其基表小得多。
从上面通过索引访问表记录的方式可以看出, 当要访问的数据量较大时, 通过每一条记录的位置去访问原始记录, 每一条符合条件的记录都需要经过索引访问后再访问基表这样一个复杂的过程,这会花费很多时间,同样,如果不经过索引而直接查询表, 也可能因为表字段太多, 记录较大的情况下把全部的数据读取进来, 这也会花费很多时间。
4 堆表的数据保存在TABLE段中,其上面的索引保存在INDEX段中;
索引组织表的数据保存在INDEX段中而不保存在TABLE 段;
索引组织表:表就是索引,索引就是表!(索引组织表,不适用更新频繁的业务)

索引组织表的特点:

这个时候就会想到, 如果 表中数据本身就是有序的, 这样查询表的时候就可以快速的找到符合条件的记录位置,而很容易判断符合条件记录的位置, 这样只需要读取一小部分数据出来就可以了, 不需要全表记录都读取出来进行判断,索引表就这样产生了,当然索引表中插入,更新资料的时候可能会因为需要排序而将数据重组, 这时候数据插入或更新速度会比堆组织表慢一些,如果堆组织表上有索引, 那么对堆组织表的插入也会因为要修改索引而变慢,堆组织表+索引≠索引组织表。

堆表无序性实验

SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

SQL> show parameter db_block_size

NAME TYPE VALUE
------------- --------- -----------------
db_block_size integer 8192

SQL> create table t1

2 (a int,
3 b varchar2(4000) default rpad('*',4000,'*'),
4 c varchar2(3000) default rpad('*',3000,'*')
5 );
Table created.
SQL> insert into t1(a) values(1);
1 row created.
SQL> insert into t1(a) values(2);
1 row created.
SQL> insert into t1(a) values(3);
1 row created.
SQL> select a from t1;
A
----------
1
2
3
SQL> delete t1 where a=2;
1 row deleted.
SQL> insert into t1(a) values(4);
1 row created.

SQL> select a from t1;

A
----------
1
4
3

SQL> set autotrace on

SQL> select a from t1 where a=3;

A
----------
3

Execution Plan
----------------------------------------------------------
Plan hash value: 3617692013
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| T1 | 1 | 13 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):

1 - filter("A"=3)
Note

  • dynamic sampling used for this statement (level=2)
    Statistics

5 recursive calls
0 db block gets
11 consistent gets
0 physical reads
0 redo size
519 bytes sent via SQL*Net to client
524 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed

最后修改:2022 年 03 月 05 日
如果觉得我的文章对你有用,请随意赞赏