Oracle体系逻辑结构

数据文件是存放数据之处,也是数据库存在的根本。

数据库(DATABASE)由若干表空间(TABLESPACE)组成,

表空间(TABLESPACE)由若干段(SEGMENT)组成,

段(SEGMENT)由若干区(EXTENT)组成,区由块(BLOCK)组成。

其中表空间包含系统表空间、回滚段表空间、临时表空间、用户表空间。数据库的组成分为数据块

头(包括标准内容和可变内容)(common and variable header),表目录区(table directory),

行目录区(row directory),可用空间区(free space),行数据区(row data)

1.数据块头(header)中包含了此数据块的概要信息,例如块地址(block address)及此数据块所属的段

(segment)的类型(比如到底是表还是索引)。

2.表目录存放了数据所在表的信息。

3.行目录就是存放插入的行地址。

4.可用空间区,就是块中的空余空间。


当用户创建一张表T时,实际就是建了一个数据段(segment)T,数据库就一定为其分配了包含若干数据块

的初始数据扩展,即使此表没有数据,但是这些数据扩展中的数据块已经为即将插入数据做好准备。

block有一个FREE空间,由PCTFREE参数决定。决定每一个块存储多少行数据。

表的设计之五朵金花:普通堆表,全局临时表,索引组织表,分区表,簇表。

普通堆表:适合大部分设计场景,需要和其它表设计取长补短。有点:语法简单方便,使用大部分应用

场景。缺点:表更新日志开销大,Delete无法释放空间,表记录太大检索较慢,索引回表读开销很大,

即使有序插入,也难以有序读出。

全局表:尤其适合接口表设计。优点:高效删除,产生日志少,不同SESSION独立,不产生锁,语法特别。

缺点:数据无法得到有效的保护。

分区表:尤其适合日志表。优点:有效的分区消除,高效的记录清理,高效的记录转移,语法复杂。

缺点:分区过多对系统有一定的影响。

索引组织表:适合极少更新的配置表。优点:表就是索引,可以避免回表,语法复杂。缺点:更新开销大。

簇表:使用频繁关联查询的多表。优点:可以减少或避免排序,语法复杂。缺点:表更新开销大。


普通堆表不足之处:

1.表更新有日志开销,可在适当场合选择全局临时表。

2.表delete操作有瑕疵,可在适当场合考虑全局临时表和分区表。

3.表记录太大检索较慢,可在适合场合选择分区表。

4.索引回表读开销很大,可在适合场所选择索引组织表。

5.有序插入难有序读出,可在适合场所选择簇表。

提醒:delete操作,删除表记录,产生的UNDO最多,由于UNDO需要REDO来保护,delete产生的REDO

也是最大。

delete删除不能释放空间,truncate是一种释放高水平的动作,这些空块被回收,空间也就释放。但是

truncate是一种DDL操作而非DML操作,truncate后面不能带条件。Oracle是支持在分区表中做truncate分区。

最实用的功能就是高效的清理数据,释放空间。


一张表就是一个SEGMENT,一般情况下需要遍历该SEGMENT的所有BLOCK来完成对该表的查询,

表越大,更新查询操作就越慢。为了减少访问路径提供了两种简单主要技术,一种是索引技术,另一种就是

分区技术。索引就是在查询的时候首先访问的是新建立出来的索引段,然后通过索引段和表段的映射关系,

迅速从表中获取行列的信息并返回结果。


order by会影效率,关于避免排序,一种思路是在order by的排序建立索引。第二种就是将普通的表改造为有序散列聚簇表,

这样可以保证有序插入,order by展现时无须再有排序动作。


全局临时表:类型是基于SESSION,基于事务。DML操作与日志产生情况插入、更新、删除。重要使用特性:1.高效删除

记录,2.不同回话独立。高效删除记录,基于事务的全局临时表COMMIT或者SESSION链接退出后,临时表记录自动删除;基于

回话的全局临时表则是SESSION链接退出后,临时表记录自动删除。针对不同回话数据独立,不同SESSION访问全局临时表。


分区表:分区表原理及类型。原理:不同分区,在不同的SEGMENT中。类型:RANGE分区,LIST分区,HASH分区,组合分区。

分区表的重要特性:1.高效的分区消除,操作落在制定分区,从而减少访问路径。2.高效的记录清理。3.高效的分区转移。

分区索引:全局索引,局部索引。

分区表相关易错点:有分区用不到,分区索引失效,分区索引效率抵消。

构造10万条记录插入到分区表注意事项:

1.范围分区的关键字为partition by range,即这三个关键字表示该分区为范围分区。

2.values less than 是范围分区特定的语法,用于指明具体的范围,比如partition p2 values less than (TO_DATE('2012-01-01',

'YYYY-MM-DD')),表示小于3月份的记录。

3.partition p1到partition p_max表示总共建立了13个分区。

4.最后还要注意partition p_max values less than(maxvalue)的部分,表示超出这些范围的记录全部落在这个分区中,免得出错。

5.分区表的分区可分别制定在不同的表空间里,如果不写即为都在同一默认表空间里。

离散分区表:离散分区表的建立和10万记录的插入。注意事项。

1.离散分区的关键字为partition by hash,出现这三个关键字即表示当前分区为散列分区。

2.散列分区与之前两种分区的明显差别在于:没有指定分区名,而是指定了分区个数。

3.散列分区的分区个数尽量设置为偶数个。

4.可以指定散列分区的分区表空间,比如增加如下一下小段,表示分别在在12个不同的表空间里,当然不写出表空间就是

在同一默认表空间里。

组合分区:1.组合分区是由主分区和从分区组成的,从分区的关键字为subpartition。

2.为了避免在每个主分区中都写相同的从分区,可以考虑用模板方式,比如在本例中的subpartition TEMPLATE

关键字。

3.只要涉及子分区模块,都需要有subpartition关键字。

4.关于表空间和之前的没有差别,依然是可以指定,也可以不指定。

Oracle11g后,还提供了RANGE-RANGE,LIST-RANGE,LIST-HASH,LIST-LIST.

分区表会产生多个SEGMENT,而普通表仅有一个SEGMENT。


分区表也是有额外的开销的,如果分区数量过多,Oracle就需要管理过多的段,早操作分区表时,也容易引发

Oracle内部大量的递归调用,此外本身的语法也有一定的复杂度。只有大表时才建议分区,记录数在100一下,

建议不建立分区。

分区转换(从普通表交换到分区表):
例子alter table test_tab split partition p_max at(TO_DATE('xxxx-xx-xx','YYYY-MM-DD')) into (PARTITION p, PARTITION P_MAX);

提醒:1.分区切割的三个关键字是split,at和into.

2.at部分在此处说明了具体的范围,小于某个制定的值。

3.into部分说明了分区被切割成两个分区,比如into(PARTITION p2013_01,PARTITION P_MAX)表示将P_MAX切割成

PARTITION p2013_01 和 PARTITION P_MAX两部分,其中括号里的P_MAX可以改为新的名字,也可以保留原来的名字。

4.分区合并你想合就合。

分区合并:例子alter table test_tab merge partition p2013_02,P_MAX INTO PARTITION P_MAX;

alter table test_tab merge partition p2013_01,P_MAX INTO PARTITION P_MAX;

提醒:1.分区合并的关键字是merge个into。

2.merge后面跟着的是需要合并的两个分区名。

3.into部分为合并后分区名,可以是新的分区名,也可以沿用已存在分区名。

分区增与删:alter table tab_test drop partition p_max;

分区追加:1.分区增加的关键字是add partition,而分区删除的关键字是drop partition.

2.由于maxvalue分区的存在,无法追加新的分区,必须删除了才可以追加。


索引:BTREE索引,位图索引,函数索引。

BTREE索引:三大特点,高度较低,存储列值,结构有序。主外键,组合索引,索引危害。

位图索引:卓越性能展现,缺陷随之出现。

函数索引:列运算让索引失效,函数索引如何应用避免列运算。

高度较低:select * from where obj_id = xx,分区索引设计。

存储列值:count(*)优化,sum/avg优化,MAX/MIN优化,索引与回表。

结构有序:order b,distinct,union.

卓越性能展现:1.统计条数奋斗夺冠,即席查询一骑绝尘。

缺陷:更新慢,重复度低。


索引是由:root(根块),Branch(茎块),Leaf(叶子块)三部分组成,其中Leaf主要存储了key colnum value,

以及能具体定位到数据块所在位置的rowid。

对于索引理解,物理结构可以理解为真正存在根、茎、叶的BLOCK。而逻辑结构可以理解为并没有存在根、茎的

BLOCK,只是一种指针或者说一种内部算法。

索引的三大特点:1.索引树的高低一般都比较低。2.索引由索引列存储的值及rowid组成。3.索引本身是由序的。


表的链接:链接类型,各类链接,索引与各链接的优化。

链接类型:嵌套循环,哈希链接,排序合并。

链接差异比较如下:

访问次数:1.嵌套循环,读懂表返回几条,被驱动表访问多少次。

2.哈希链表:驱动表和被驱动表都是最多被访问1次。

3.排序合并:驱动表和被驱动表都是最多被访问1次。

驱动顺序:1.嵌套循环,有驱动顺序。

2.哈希链接,有驱动顺序。

3.排序合并,无驱动顺序。

4.嵌套循环,无须排序。

排序差别:1.嵌套循环:无须排序。

2.哈希链接,无须排序。

3.排序合并:需要排序。

限制场景:1.嵌套循环:无任何限制。

2.哈希链接:链接条件<>><或LIKE导致无法使用。

3.排序合并:链接条件是<>或LIKE导致无法使用。

索引与各链接经典优化:1.嵌套循环,驱动表限制条件有索引,被驱动表链接条件有索引。

2.哈希链接:索引在表链接中无特殊要求,与单表情况无异。

3.排序合并:索引消除排序。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值