深入理解Oracle表(7):10种表类型的数据存储和适用场景浅析
2013-02-14 11:04
731 查看
本博文Think主要从两个问题着手:
① 在哪些情况下某种类型的表比其他表类型更适用?
② 不同类型的表其数据是如何组织和存储的?
闲言少叙,一家之言,欢迎拍砖:
㈠ 堆组织表
⑴ 数据存储
如果把一个区当作一个箱子,那么一个表就是一组无序的箱子堆在一起
只要有可用的空间,数据可以放在任何地方
全表扫时,会按命中顺序来获取数据,而非插入的顺序
⑵ 适用场景
应用中99%的情况下使用的可能都是堆组织表
执行create table语句时,默认得到的表类型就是堆组织表
由于堆组织表在存储速度上较快,比较适合write I/O较多的情景
⑶ 相关参数
以下参数仅适用ASSM
① PCTFREE
这个参数用于控制能否将一行增加到一个块上
如果设置的PCTFREE参数过小,也会导致没有给update操作留下足够的空闲空间
② INITRANS
为块初始化分配的事务槽数,缺省为2,这也是最小值
每个并发事务都需要一个事务槽
倘若您认为将对同样的块完成多个并发操作,就应该考虑增大该值
不过现在该参数已经可以自动调整了,除非遇到相关等待,不需要过多关注
㈡ 索引组织表
⑴ 数据存储
索引组织表的数据保存在Index段中而不是Table段
也就是,索引和数据是在一起的,数据是有序被存储
⑵ 适用场景
什么时候用IOT要考虑的因素很多,连Tom 说一大堆也没说明白.
但什么时候不用IOT却很清楚:如果不是大多情况下使用主键访问表,就不要用IOT
⑶ 相关参数
① OVERFLOW
该选项允许您建立另一个段(这就使得IOT成为一个多段对象)
如果IOT的行数据变得太大,就可以溢出到这个段中
② PCTTHRESHOLD
如果PCTTHREHOLD是10%,而块大小是8K,则长度>800字节的行就会把其中一部分放到溢出段中
③ INCLUDING
行中从第一列直到INCLUDING子句所指定列(也包括这一列)的所有列都存储在索引块上,余下的列存储在溢出段中
④ PCTFREE和PCTUSED对于考虑OVERFLOW段时的IOT意义非凡,像对待堆表时一样对待溢出段
㈢ 索引聚簇表
⑴ 数据存储
含2层意义:
多张表的相关字段保存在同一个块中
多张表共同使用一个索引
⑵ 适用场景
如果数据主要用于读,而且要通过索引来读,另外还会频繁地把这些信息联结在一起,此时,索引聚簇表就很合适了
⑶ 相关参数
① SIZE
控制每个块上存储多少个聚簇键
㈣ 哈希聚簇表
⑴ 数据存储
数据在存储上同索引聚簇一样,然而在索引方面
哈希簇是通过哈希函数直接定位数据的物理地址
⑵ 适用场景
适合可以估计出大小的表,并且绝大多数查询都是通过HASH列进行等值查询
全表扫描效率较低
而且,HASH聚簇同样不适合大量DML操作
⑶ 相关参数
① HASHKEYS
指定hash表的大小
哈希簇要预分配足够的空间来保存(HASHKEYS/trunc(blocksize/SIZE))字节的数据
例如:如果将SIZE设置为1500字节,而且块大小为4KB
则Oracle会在每个块上存储2个键
如果你计划有1000个hashkeys
那么,Oracle将分配500个块
㈤ 有序哈希聚簇表
⑴ 数据存储
数据在存储上同哈希聚簇上是一样的
唯一不同的是,数据可以按你选择的某个字段有序地存储
⑵ 适用场景
形如:
select *
from t
where KEY = :x (例如 cust_id = :x)
order by sorted_column
也就是说,要按照某个键获取数据,但要求这些数据按另外某个列排序
⑶ 相关参数
① SORT
比如,我们指定:create table t (order_dt timestamp SORT)
则数据按order_dt物理地获取和排序
㈥ 嵌套表
⑴ 数据存储
隐藏列增加raw(16)存储开销
父表上会默认建立一个惟一索引
嵌套表模型,每个父行都有一个虚拟的表;而在父/子表(关系模型),每个父行都有一个行集
⑵ 适用场景
2个用途:
① 用于扩展PL/SQL 语言,这是常见的用法
② 作为一种物理存储机制(几乎没用!)
如果把嵌套表用作一个存储机制,一定要保证将嵌套表建立为一个IOT
以避免nested_table_id上索引的开销以及嵌套表本身的开销
倘若没用IOT,则要确保nested_table_id列上创建一个索引,来避免为查找子行而全表扫
在工业环境,完全可以用父子表+视图的方案来替代
㈦ 临时表
⑴ 数据存储
临时表的数据是放在PGA中的,如果往临时表中插入的数据量很大,超过PGA的大小,则数据将放于临时表空间
⑵ 适用场景
参看Think之前写的一篇文章:Oracle 临时表之临时表的应用问题
㈧ 外部表
⑴ 数据存储
数据在OS层,元数据在数据字典里定义
⑵ 适用场景
大量数据 平面文件 只查询 不更新
还有就是对文本.日志.进行查询.统计.分析
㈨ 对象表
⑴ 数据存储
对象表实际上是伪装的关系表,总会转换为原来的关系行和列
伪主键增加raw(16)存储开销
创建了一个额外的索引
⑵ 适用场景
① 存储上:工业环境,我们一般使用关系表上的视图来取代对象表作为一种存储机制
② 封装性:对象表的引用是为了使数据更有封装的特点
③ 开发上:扩展了PL/SQL,方便开发
㈩ 分区表
⑴ 数据存储
一张分区表对应多个分区,每个分区是一个Segment,这些分区Segment可建在相同的Tablespace上,也可一个分区对应一个Tablespace
⑵ 适用场景
① 管理上:分区,分而治之,其重点在于高可用(管理),而附属价值才是性能的提高
② 查询时:在查询时指定访问某个Segment,这样从物理文件上减少I/O访问,从而可以优化查询
③ 理数据:我认为最能体现分区表好处的地方就是处理历史数据的时候
① 在哪些情况下某种类型的表比其他表类型更适用?
② 不同类型的表其数据是如何组织和存储的?
闲言少叙,一家之言,欢迎拍砖:
㈠ 堆组织表
⑴ 数据存储
如果把一个区当作一个箱子,那么一个表就是一组无序的箱子堆在一起
只要有可用的空间,数据可以放在任何地方
全表扫时,会按命中顺序来获取数据,而非插入的顺序
⑵ 适用场景
应用中99%的情况下使用的可能都是堆组织表
执行create table语句时,默认得到的表类型就是堆组织表
由于堆组织表在存储速度上较快,比较适合write I/O较多的情景
⑶ 相关参数
以下参数仅适用ASSM
① PCTFREE
这个参数用于控制能否将一行增加到一个块上
如果设置的PCTFREE参数过小,也会导致没有给update操作留下足够的空闲空间
② INITRANS
为块初始化分配的事务槽数,缺省为2,这也是最小值
每个并发事务都需要一个事务槽
倘若您认为将对同样的块完成多个并发操作,就应该考虑增大该值
不过现在该参数已经可以自动调整了,除非遇到相关等待,不需要过多关注
㈡ 索引组织表
⑴ 数据存储
索引组织表的数据保存在Index段中而不是Table段
也就是,索引和数据是在一起的,数据是有序被存储
⑵ 适用场景
什么时候用IOT要考虑的因素很多,连Tom 说一大堆也没说明白.
但什么时候不用IOT却很清楚:如果不是大多情况下使用主键访问表,就不要用IOT
⑶ 相关参数
① OVERFLOW
该选项允许您建立另一个段(这就使得IOT成为一个多段对象)
如果IOT的行数据变得太大,就可以溢出到这个段中
② PCTTHRESHOLD
如果PCTTHREHOLD是10%,而块大小是8K,则长度>800字节的行就会把其中一部分放到溢出段中
③ INCLUDING
行中从第一列直到INCLUDING子句所指定列(也包括这一列)的所有列都存储在索引块上,余下的列存储在溢出段中
④ PCTFREE和PCTUSED对于考虑OVERFLOW段时的IOT意义非凡,像对待堆表时一样对待溢出段
㈢ 索引聚簇表
⑴ 数据存储
含2层意义:
多张表的相关字段保存在同一个块中
多张表共同使用一个索引
⑵ 适用场景
如果数据主要用于读,而且要通过索引来读,另外还会频繁地把这些信息联结在一起,此时,索引聚簇表就很合适了
⑶ 相关参数
① SIZE
控制每个块上存储多少个聚簇键
㈣ 哈希聚簇表
⑴ 数据存储
数据在存储上同索引聚簇一样,然而在索引方面
哈希簇是通过哈希函数直接定位数据的物理地址
⑵ 适用场景
适合可以估计出大小的表,并且绝大多数查询都是通过HASH列进行等值查询
全表扫描效率较低
而且,HASH聚簇同样不适合大量DML操作
⑶ 相关参数
① HASHKEYS
指定hash表的大小
哈希簇要预分配足够的空间来保存(HASHKEYS/trunc(blocksize/SIZE))字节的数据
例如:如果将SIZE设置为1500字节,而且块大小为4KB
则Oracle会在每个块上存储2个键
如果你计划有1000个hashkeys
那么,Oracle将分配500个块
㈤ 有序哈希聚簇表
⑴ 数据存储
数据在存储上同哈希聚簇上是一样的
唯一不同的是,数据可以按你选择的某个字段有序地存储
⑵ 适用场景
形如:
select *
from t
where KEY = :x (例如 cust_id = :x)
order by sorted_column
也就是说,要按照某个键获取数据,但要求这些数据按另外某个列排序
⑶ 相关参数
① SORT
比如,我们指定:create table t (order_dt timestamp SORT)
则数据按order_dt物理地获取和排序
㈥ 嵌套表
⑴ 数据存储
隐藏列增加raw(16)存储开销
父表上会默认建立一个惟一索引
嵌套表模型,每个父行都有一个虚拟的表;而在父/子表(关系模型),每个父行都有一个行集
⑵ 适用场景
2个用途:
① 用于扩展PL/SQL 语言,这是常见的用法
② 作为一种物理存储机制(几乎没用!)
如果把嵌套表用作一个存储机制,一定要保证将嵌套表建立为一个IOT
以避免nested_table_id上索引的开销以及嵌套表本身的开销
倘若没用IOT,则要确保nested_table_id列上创建一个索引,来避免为查找子行而全表扫
在工业环境,完全可以用父子表+视图的方案来替代
㈦ 临时表
⑴ 数据存储
临时表的数据是放在PGA中的,如果往临时表中插入的数据量很大,超过PGA的大小,则数据将放于临时表空间
⑵ 适用场景
参看Think之前写的一篇文章:Oracle 临时表之临时表的应用问题
㈧ 外部表
⑴ 数据存储
数据在OS层,元数据在数据字典里定义
⑵ 适用场景
大量数据 平面文件 只查询 不更新
还有就是对文本.日志.进行查询.统计.分析
㈨ 对象表
⑴ 数据存储
对象表实际上是伪装的关系表,总会转换为原来的关系行和列
伪主键增加raw(16)存储开销
创建了一个额外的索引
⑵ 适用场景
① 存储上:工业环境,我们一般使用关系表上的视图来取代对象表作为一种存储机制
② 封装性:对象表的引用是为了使数据更有封装的特点
③ 开发上:扩展了PL/SQL,方便开发
㈩ 分区表
⑴ 数据存储
一张分区表对应多个分区,每个分区是一个Segment,这些分区Segment可建在相同的Tablespace上,也可一个分区对应一个Tablespace
⑵ 适用场景
① 管理上:分区,分而治之,其重点在于高可用(管理),而附属价值才是性能的提高
② 查询时:在查询时指定访问某个Segment,这样从物理文件上减少I/O访问,从而可以优化查询
③ 理数据:我认为最能体现分区表好处的地方就是处理历史数据的时候
相关文章推荐
- Oracle基本数据类型存储格式浅析(五)——RAW类型
- Oracle基本数据类型存储格式浅析
- Oracle基本数据类型存储格式浅析(五)——RAW类型
- Oracle基本数据类型存储格式浅析(一)——字符类型
- Oracle基本数据类型存储格式浅析(一)—(五)
- Oracle基本数据类型存储格式浅析(四)——ROWID类型(一)
- Oracle基本数据类型存储格式浅析
- Oracle基本数据类型存储格式浅析(二)——数字类型
- Oracle基本数据类型存储格式浅析
- Oracle基本数据类型存储格式浅析(一)—(五)
- Oracle基本数据类型存储格式浅析(一)——字符类型
- Oracle基本数据类型存储格式浅析
- Oracle基本数据类型存储格式浅析(二)——数字类型
- Oracle基本数据类型存储格式浅析(一)——字符类型
- Oracle基本数据类型存储格式浅析(三)——日期类型
- Oracle基本数据类型存储格式浅析
- Oracle基本数据类型存储格式浅析(一)——字符类型
- Oracle基本数据类型存储格式浅析(四)——ROWID类型
- Oracle基本数据类型存储格式浅析(二)——数字类型
- Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G