数据文件是存放数据之处,也是数据库存在的根本。
数据库(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.排序合并:索引消除排序。