分区表与分区索引的作用

您所在的位置:网站首页 分区表和索引的作用 分区表与分区索引的作用

分区表与分区索引的作用

2024-07-13 13:00| 来源: 网络整理| 查看: 265

一 分区表的作用与分类

Oracle 的表分区功能可以使某些查询以及维护操作的性能大大提高。

当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。从应用程序的角度来看,分区后的表与非分区表完全相同,使用 SQL DML 命令访问分区后的表时,无需任何修改。

1.1、分区表的优点、缺点、特性:

(1)由于将数据分散到各个分区中,减少了数据损坏的可能性;

(2)可以对单独的分区进行备份和恢复;

(3)可以将分区映射到不同的物理磁盘上,来分散 IO;

(4)提高可管理性、可用性和性能。

(5)缺点:已经存在的表没有方法可以直接转化为分区表。不过 Oracle 提供了在线重定义表的功能。

(6)特殊性:含有 LONG、LONGRAW 数据类型的表不能进行分区,一般分区类型为varchar,varchar2,number,date

(7)每个表的分区或子分区数的总数不能超过 1023 个。

1.2、什么时候用分区表(设计原则):

(1)单表过大,当表的大小超过 2GB,或对于 OLTP 系统,表的记录超过 1000 万,都应考虑对表进行分区。

(2)历史数据据需要剥离的,表中包含历史数据,新的数据被增加到新的分区中。

(3)查询特征非常明显,比如是按整年、整月或者按某个范围!

(4)基于表的大部分查询应用,只访问表中少量的数据。

(5)按时间段删除成批的数据,例如按月删除历史数据。

(6)按时间周期进行表空间的备份时,将分区与表空间建立对应关系。

(7)如果一个表中大部分数据都是只读数据,通过对表进行分区,可将只读数据存储在只读表空间中,对于大数据库的备份是非常有益的。

(8)对于经常执行并行查询的表应考虑进行分区。

(9)当对表的部分数据可用性要求很高时,应考虑进行表分区。

1.3、分区表的类型

(1)范围分区(Range Partitioning) 8+,

以某一个范围进行分区。eg:时间段划分。

(2)列表分区(List Partitioning) 9i+,

以某一些几个值进行分区。eg:地区分区,省份进行划分。

(3)哈希分区(Hash Partitioning),8i+,

根据 hash 值进行的散列分区 ,可以有效的消除 io 的竞争。 更多用在组合分区的子分区中。

(4)复合分区,9i 开始,Oracle 就包括了 2 种复合分区,RANGE-HASH 和RANGE-LIST。 8i+

在 11g, Oracle 一下就提供了 4 种复合分区: RANGE-RANGE 、LIST-RANGE、LIST-HASH 和 LIST-LIST

(5)间隔分区(Interval Extension to Range Partitioning (11g) ),

它就是以一个区间分区表为“起点”,并在定义中增加了一个规则(即间隔),使数据库知道将来如何增加分区。eg:比如每个月增加一个分区,从而省去了你不断的ADD 或者 SPLIT 新的分区。

(6)参考分区(Referential Partitioning (11g))

对于主子表关系,如果对主表进行了分区,那么可以在子表上根据外键约束来建立对应主表的分区。

(7)虚拟字段分区(Virtual Column Partitioning (11g)),

虚拟列的值从其他的列推导而来,Oracle 只保存源数据,这个列不占存储空间。虚拟列其中一个引申功能就是虚拟列分 区功能。11g 增加对虚拟列的支持,这使得分区功能更加灵活。

(8) 系统分区 11g

11g 以前的分区表,需要指定一个或多个分区字段,并根据这个分区字段的值,按照一定的算法(RANGE、HASH 和 LIST)来决定一条记录属于那个分区。从 11g 开始,Oracle 允许用户不指定分区列,完全根据程序来控制数据存储在那个分区中。

二、分区索引的作用与分类

与分区表类似(partitioned table),分区索引(partitioned index)也能够提高系统的可管理性,可用性,可伸缩性,及系统性能。

对于索引,需要区分创建的是全局索引,或本地索引:

分区索引既可以与分区表相对独立(全局索引(global index)),

也可以采用与分区表相同的分区方式(本地索引(local index))。

普通表可以建分区索引,分区表可以建非分区的 global index,也可以建 range 或hash 分区的 global index,也可以建基于分区的 local index。

使用如下:

表 索引

----------------- -----

分区 不分区

分区 分区

不分区 分区

不分区 不分区

2.1 全局索引(global index):

即可以分区,也可以不分区。即可以建 range 分区,也可以建 hash 分区,即可建于分区表,又可创建于非分区表上,就是说,全局索引是完全独立的,因此它也需要我们更多的维护操作。

2.2 本地索引(local index):

其分区形式与表的分区完全相同,依赖列相同,存储属性也相同。对于本地索引,其索引分区的维护自动进行,就是说你 add/drop/split/truncate 表的分区时,本地索引会自动维护其索引分区。

本地索引又可以分为有前缀(prefix)的索引和无前缀(nonprefix)的索引。

而全局索引目前只支持有前缀的索引。

如果本地索引的索引列以分区键开头(分区用什么列分的,索引就用什么列创建,11对应),则称为前缀局部索引。

如果本地索引的列不是以分区键开头,或者不包含分区键列(分区用什么列分的,索引就不用什么列创建。12不对应),则称为非前缀索引。

全局索引的索引列必须是以索引分区键作为其前几列。

2.3 什么情况下建什么分区索引呢?

1)当有表的分区或子分区操作维护的时候,本地索引提供更好的可用性;

(如合并分区时,只有合并的表分区的分区索引失效,而非分区索引以及全局分区索引在合并.删除表分区后全部失效;可以单独重建本地索引;若只有一个分区需要维护,则只有一个本地索引受影响。

2)本地索引可以提高性能,因为数据大,很多分区必然会被并行的查询。

3)对于历史表,本地索引是必须,这样在有规律的 drop 分区的时候,比较方便。

4)本地索引多应用于数据仓库环境中。

5)在非分区字段上建立 unique 索引只能建全局索引。

6)全局索引不支持位图索引,全局分区索引全局分区索引只能是 B 树索引。

7)全局索引多应用于 oltp 系统中。

8)全局分区索引只按范围或者散列 hash 分区,hash 分区是 10g 以后才支持。

9)表用 a 列作分区,索引用 b列 做局部分区索引,若 where 条件中用 b列 来做条件查询,那么oracle 会扫描所有的表和索引的分区,成本会比分区更高,此时可以考虑用 b 列做全局分区索引。

本地分区索引是对单个分区的,每个分区索引只指向一个表分区,全局索引则不然,一个分区索引能指向 n 个表分区,同时,一个表分区,也可能指向 n 个索引分区,对分区表中的某个分区做 truncate 或者 move,shrink 等,可能会影响到 n 个全局索引分区,正因为这点,本地分区索引具有更高的可用性。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3