近期做了一个Oracle大批量数据导入、处理、查询的项目,看了不少官方文档和书籍。把相关技术知识点简单整理一下,作为一个专题以供留存。
推荐书籍
- 《Oracle性能诊断艺术》
- 《Oracle高效设计》
- Oracle官方文档
表分类
堆表Ordinary (heap-organized) table
默认表类型,索引和数据分开存储
索引组织表Index-organized table
- 含义:主键索引采用Btree存储,主键索引和表数据储存在一起。
- 适用场景:索引组织表可以加快通过主键访问数据的速度,用于经常对数据根据主键进行访问的场景。
分区表Partitioned table
- 含义:对表的数据根据特定列值进行拆分为不同的储存空间
- 优点:
- 查询可以只针对部分分区,而不是全表,提升查询性能;
- 在使用分区索引的情况下,可以加快insert、delete性能
- 对数据的清理和维护更加方便(可单独对分区中的数据进行维护)
- 适用场景:
- 大于2GB的表应当被分区
- 包含历史数据的表可以使用分区,新的数据放在新的分区,老数据可以简便的被删除和转移。
- 表数据被分割在不同的存储设备上。
索引组织表也可被分区
- 分区策略:
- 列表分区:以列的值作为分区的划分条件
- 范围分区:以列的值的范围来做为分区的划分条件
- Hash分区:通过Hash函数将数据平均分配到指定的几个分区中
- 间隔分区:范围分区的扩展,可以自动根据间隔创新新的分区。只能对一个number或date类型的数据进行分区,不支持索引组织表。
- 组合分区:通过组合上述策略进行两级分区。
列表-列表、列表-范围、列表-Hash
范围-范围、范围-列表、范围-Hash
间隔-列表、间隔-范围、间隔-Hash - 引用分区:在主表是分区表的情况下,与主表为有外键关联的子表数据位于和主表关联数据相同的分区中。Oracle11不支持间隔分区的引用分区,Oracle12支持。
- 虚拟列分区: Oracle11g起可以依据虚拟列字段值进行分区。
聚簇表Clustered table
- 含义:一组通过公共列组织在一起并分享数据库的表
- 特点:通过Hash进行索引,具有相同公共列值的数据储存在一起
- 适用场景:
经常根据公共列连表查询。如查询论坛帖子及其评论。
外部表External table
- 含义:直接加载通过扁平文件定义的表
- 特点:只能用于查询,无法修改数据,无法建立索引
- 适用场景:
将文件数据导入到数据表中
索引
索引数据结构分类
- B树索引
- 创建方式:create index name on table(field)
- 特点:
- 采用树结构存储,优化= > <等性能
- 一个查询中只能使用一个B树索引(Oracle可设置更改)
- 位图索引
- 创建方式:create bitmap index name on table(field)
- 特点:
- 只能用于=、in等指定值查询
- 当数据重复度高时使用,在数据值数量/数据行数<1%时使用。
- 一个查询中可以同时使用多个位图索引。
- 重建速度快,但对插入、更新、删除效率影响较大,一般常用于OLAP系统。
- Hash索引
用于聚簇表
分区表索引
- 全局索引:
索引独立于分区,索引存储在一个地点,不像表一样进行分区 - 本地分区索引:
索引自动根据数据进行分区,每个索引分区对应一个表分区 - 全局分区索引:
将索引按照Hash或范围进行分区,索引的分区与表分区非1:1关系
全局索引和分区索引的选择
- 表分区列是索引的一部分,使用分区索引
- 索引具有唯一性,且不是在分区列中,使用全局索引
- 可管理性优先级高时,使用分区索引(可以快速删除、移动一个分区及其索引)
- 关注响应时间应优先选择全局索引,关注吞吐量优先选择分区索引(全局索引消耗资源较多,但速度较快;分区索引速度较慢,但消耗资源少)
本文介绍了Oracle数据库中不同类型的表结构(堆表、索引组织表、分区表等),并详细探讨了各种索引(B树索引、位图索引、Hash索引等)的创建方式及适用场景。
8081

被折叠的 条评论
为什么被折叠?



