数据库 Partitioning 概述
当数据库表中的数据不断增大,必然会导致数据的查询速度降低,从而应用程序的性能就会下降,这时就应该考虑对表进行分区,数据放在不同的分区这样在进行数据读取时就可以并行处理,从很大程度上提高数据的访问速度。还需要说明的是,表进行分区后,逻辑上表还是完整的,而只是把表中的数据在物理上存放到不同的表空间中(物理文件上),从而进行数据查询时,就不至于每次都扫描整张表。
总体来说,partition 可以从很大程度上改善数据库的性能,并且对数据的分区管理还可以改善管理员管理数据的灵活性以及可用性,如某个分区出现故障,其它分区的数据仍可用,同时管理员只需修复该分区即可。同时可以把不同的分区映射到磁盘从而均衡 IO。
Oracle 与 DB2 的 partitioning
图 1. 不同共享模式架构
无论是 oracle 还是 db2,为了提高数据的读写性能,在系统架构方面都采取了并行的方式,对于并行模式又可以分为以下几种:
- Share everything
这是最简单的一种方式,即在同一台机器上多个进程并行执行,处理器在处理过程中共享内存缓冲池、共享物理存储。这种方式受制于机器的物理资源。
- Share disk
在这种架构下,所有的机器共享一个物理存储;由于每台物理机器都独立于数据库中数据,这就能够最大限度的保证了机器数量的自由行。同样,由于每台机器都会扫描磁盘上的所有表,也就导致总体性能受制于大型系统。
- Share memory
即所有机器共享内存。
- Share nothing
数据分布在所有的机器上,每台机器有各自的存储。正因为如此,当增减机器的时候也会给整个系统带来影响;同时,因为每台机器只能访问各自的物理存储,这也就保证了系统性能可以近乎线性的提高。
Oracle 分区介绍
Oracle 采用的是 share-disk 架构,因此 oracle 的分区特性只是在同一磁盘上,这就决定了它不存在 DPF 的特性,只存在表分区。下面主要介绍一下 oracle 的几种主要的表分区。
- Range partition(区间分区)
Range partition 是比较常见的一种分区方式,它把数据基于分区键划定的范围映射到分区内。分区键即表中的某一列,而日期是经常被采用的分区键。Range partition 具有如下性质:
- 通过 values less than 子句指定上限值,大于或等于该值得数据都被分配到下一个分区。当然分区的下限值即为上一个分区的上限值。
- 在最高分区中定义 MAXVALUE。它代表了高于其它所有分区的值,包括控制。
- list partition(列表分区)
List partition 能够明确指定用列中的哪些具体的值来进行分区,这样的分区方式是 Range 和 Hash 所做不到的,这种方式的有点就是:用户可以组织和分组哪些没有顺序和没有关系的数据集合,用户可以明确的控制多少行被分区。
- hash partition(散列分区)
Hash Partitioning 映射数据到基于 HASH 算法的分区上,HASH 算法将应用你指定的分区关键字,平均的分那些在 Partitions 中的行。给每 一个分区近似相同的大小,要保证数据能平均分配,分区数一般是 2N。比如说,需要 insert sales_hash 一条数据,ORACLE 会通过 HASH 算法处理 salesman_id,然后找到对于的分区表进行 insert。Hash Partitioning 是为跨越设备的分布式数据提供了一种理想的方法,HASH 算法也很容易转化成 RANGE 分区方法,特别是当被分区的数据不是历史数据时。
- 复合分区
传统的复合分区包括范围 - 列表分区和范围 - 散列分区,范围 - 列表分区是范围和列表技术的组合,其实质是首先对表数据按照范围进行分区,然后再利用列表对每个范围再次分区。每个子分区的内容表示数据的逻辑子集。范围 - 散列分区是范围和散列技术的组合,其实质就是首先对表进行区间分区,然后再把数据散列的分别在几个表空间中。
Oralce11G 中又增加了 RANGE-RANGE、LIST-RANG、LIST-HASH 和 LIST-LIST,但是在本文中没有考虑这 4 中复合分区。
DB2 分区介绍
在 DB2 中,分区可以从以下几个方面来说:
- 数据库分区
即数据库分区特性(DPF),如图 2 所示。
- 表分区
在 db2 的表分区又可以称为数据分区或者区间分区。这种数据组织模式与 oracle 类似,就是把数据分散存储于不同的存储对象中,这种存储对象是按照 1 个或多个表列得值来进行划分的数据分区或者数据范围。每个数据分区被存储在不同的表空间中。
- MDC
多维数据集即 MDC 是在 DB2 V8 时引入的,它把类似的数据按照多维聚集在一块存放在磁盘上,这样数据在读取是就可以整块的读取从而提高了 I/O 的效率。例如对于 Product=car,Region=East 的所有行,可以按照这两个字段作为维,把这两个字段相同的数据存储在相同的位置,即所谓的块(block),一个块的大小等于表空间的扩展数据块(extent)大小,扩展数据块是磁盘上的一组连续页,所以将这些具有类似值的行在物理上是存放在连续的数据页上。了解 MDC 相关内容和细节,可以查看 DB2 9.7 信息中心的“多维集群表”。
图 2.DB2 DPF 架构
Oracle 分区与 DB2 分区的对比
|