完成本课程的学习后,您应该能够:
•普通堆表优点和缺点
•理解rowid
•全局临时表优点、缺点和适用场景
•分区表的类型和原理、优点和缺点、适用场景
•表字段的高效设计
•sequence的设计
1.数据存储方式
- 在关系数据库中有很多种数据存储方式,有些DBMS全部支持,有些则只支持其中的一部分。数据库的存储方式至关重要,它对数据的修改和查询都有直接的影响。
- 存储方式可分为两种:随机存储方式和固定存储方式。前者存储效率必然要高于后者。但如我们的人生一样,得到多少就意味着要失去多少。
- 随机存储方式在写入数据时可以轻而易举的进行存储,在查询时候则要付出更高的代价;
- 固定存储方式在写入数据时花费了时间和精力,则在查询上获得性能的提升。
2.堆表
堆表的最大特征就是数据的存储独立性,即数据的存储与数据值没有任何关联地被存储在磁盘的任意位置上(允许数据被存储在磁盘的任意位置上)。
从另一个角度看,随机存储方式就是数据所占用的位置分散到不同的数据块上。由于数据被分散地存储在多个数据块上,数据的读取效率也同样的会随着它们的分散程度的不同而不同,即分散程度越高,数据读取效率越低;分散程度越低,数据读取效率越高。
2.1堆表的优、缺点
•优点
语法简单,使用方便
•缺点
表更新产生redo开销大
delete无法释放空间
表记录太大检索较慢
索引回表开销大
即使有序插入,难有序读出
•适用场景
适用大部分场景
实验2.1 测试Redo大小
http://blog.csdn.net/guogang83/article/details/7848974 测量redo脚本: create or replace view v_measure_redo_size as select name, value from v$mystat, v$statname where v$mystat.statistic# = v$statname.statistic# and v$statname.name = 'redo size'; 测量redo、undo脚本: create or replace view v_measure_redo_undo_size as select name, value from v$mystat, v$statname where v$mystat.statistic# = v$statname.statistic# and (v$statname.name = 'redo size' or v$statname.name = 'undo change vector size');
SQL> create table test as select * from dba_objects; SQL> select segment_name,bytes/1024/1024 from user_segments s where s.segment_name='TEST'; SEGMENT_NAME BYTES/1024/1024 ------------------------- --------------- TEST 6 SQL> select * from v_measure_redo_size; NAME VALUE ---------------------------------------------------------------- ---------- redo size 86644 SQL> delete from test; SQL> commit; SQL> select * from v_measure_redo_size; NAME VALUE ---------------------------------------------------------------- ---------- redo size 18293628 SQL> select (18293628-86644)/1024/1024 from dual; (18293628-86644)/1024/1024 -------------------------- 17.363533 SQL> insert into test select * from dba_objects; SQL> commit; SQL> create index ind_object_id on test(object_id); SQL> select * from v_measure_redo_size; NAME VALUE ---------------------------------------------------------------- ---------- redo size 24878160 SQL> delete from test; SQL> commit; SQL> select * from v_measure_redo_size; NAME VALUE ---------------------------------------------------------------- ---------- redo size 53255224 SQL> select (53255224-24878160)/1024/1024 from dual; (53255224-24878160)/1024/1024 ----------------------------- 27.0624771
SQL> drop table test purge; SQL> create table test as select * from dba_objects; SQL> set autotrace on --第二次执行此SQL语句的结果 SQL> select count(*) from test; SQL> set autotrace off SQL> set autotrace on SQL> delete from test; 已删除50417行。 SQL> commit; SQL> select count(*) from test; COUNT(*) ---------- 0 SQL> truncate table test; SQL> select count(*) from test; COUNT(*) ---------- 0