简答题 8.  分区表有什么优点?分区表有哪几类?如何选择用哪种类型的分区表?
【正确答案】当表中的数据量不断增大时,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。当对表进行分区后,在逻辑上,表仍然是一张完整的表,只是将表中的数据在物理上可能存放到多个表空间或物理文件上。当查询数据时,不至于每次都扫描整张表。Oracle可以将大表或索引分成若干个更小、更方便管理的部分,每一部分称为一个分区,这样的表称为分区表。SQL语句使用分区表比全表能提供更好的数据处理与访问的性能。即使某些分区不可用,其他分区仍然可用,这称为分区独立性。
   分区表的一些限制条件:①簇表不能进行分区。②不能分割含有LONG或LONG RAW列的表。③索引组织表不能进行范围分区。
   (1)何时考虑分区?对大表进行分区,将有益于大表操作的性能和大表的数据的维护。官方文档说通常当表的大小超过2GB,或对于OLTP系统,当表的记录超过1000万条时,都应考虑对表进行分区。
   (2)分区表有什么优点?分区表有如下的优点:
   1)增强可用性:如果表的一个分区由于系统故障而不能使用,那么表的其余好的分区仍可以使用。
   2)减少关闭时间:如果系统故障只影响表的一部分分区,那么只有这部分分区需要修复,可能比整个大表修复花的时间更少。
   3)维护轻松:单独管理每个分区比管理单个大表要轻松得多。
   4)均衡I/O:可以把表的不同分区分配到不同的磁盘来平衡I/O,改善性能。
   5)改善性能:对大表的查询、增加、修改等操作可以分解到表的不同分区来并行执行,可使运行速度更快。
   6)分区对用户透明,最终用户感觉不到分区的存在。
   (3)有哪些类型的分区?如何选择用哪种类型的分区表?Oracle的分区可以分为:
   1)范围分区(RANGE PARTITION)。
   2)哈希分区(HASH PARTITION)。
   3)列表分区(LIST PARTITION)。
   4)复合分区(组合分区)。
   5)INTERVAL分区(间隔分区)。
   6)系统分区。
   INTERVAL分区和系统分区是Oracle 11g的新特性,由于篇幅原因,本书中不讲解这2个分区,读者可自行查阅官方文档进行学习。尤其对于INTERVAL分区在生产环境中还是比较实用的。下面作者将对范围、哈希、列表和复合分区分别进行讲解。
   (1)RAN(讵(范围)分区在如下几种情况下会使用到范围分区:
   1)频繁地被一个时间范围谓词扫描。
   2)维护一个时间滚动的数据窗口(Rolling Window Of Data)。
   3)保存历史数据的表。
   (2)HASH(哈希)分区HASH分区有如下的优点:
   1)提高了大表的高可用性和可管理性。
   2)可以避免数据倾斜,将数据均匀地分布在多个物理设备上,最大化I/O吞吐量。
   3)分区修剪和分区智能连接。
   4)要求分区键是高基数列。
   5)分区修剪不支持基于分区字段的范围查询,只支持等值查询或IN-LIST查询。
   HASH分区能够很容易对数据进行分区,因为语法很简单,很容易实现。在下面这几种情况下,使用HASH分区比RANGE分区更好:
   1)事先不知道需要将多少数据映射到给定范围的时候。
   2)分区的范围大小很难确定,或者很难平衡的时候。
   3)RANGE分区使数据得到不期望的聚集时。
   4)性能特性,如并行DML、分区修剪和分区连接很重要的时候。
   (3)LIST(列表)分区列表分区(LIST PARTITION)提供了一种按照字段的值来进行分区的方法,这种方法非常适合于有高重复率字段值的表。通过这种方法,可以非常方便地控制将某些特定的数值存放到一个分区。
   列表分区有如下特点:
   1)列表值是离散的。
   2)列表值是无序的,例如:PARTITION PART_01 VALUES('A','E','F')等。
   3)分区键仅能包含一个列。
   4)列表值是低基数的。
   (4)复合分区如果某表按照某列分区之后,仍然较大,或者是有一些其他的需求,那么还可以通过在分区内再建子分区的方式将分区冉分区,即复合分区的方式。
   复合分区在Oracle 11g之前有两种:RANGE-HASH与RANGE-LIST。需要注意的是其顺序,根分区只能是RANGE分区,子分区可以是HASH分区或LIST分区,而Oracle 11g在复合分区功能这块有所增强,又推出了RANGE-RANGE、LIST-RANGE、LIST-LIST和LIST-HASH,这就相当于除HASH外3种分区方式的笛卡尔形式都有了,即目前一共有6种分区,但根分区只能是RANGE分区或LIST分区。
   在某些时候按照业务要求,上面的几种分区也可以按照一定的目的创建复合分区,或者称为子分区。
   对于海量数据的数据库设计,分区的设计非常重要。例如,对于一个大表,应该采用哪种类型的分区,对于以后数据库的性能和管理至关重要。
   其实,范围分区、HASH分区和列表分区这3种分区的特点都非常明显,如下:
   1)如果需要进行数据的过期化处理,那么范围分区基本上是唯一的选择。
   2)如果需要数据的均匀分布,那么可以考虑使用HASH分区。
   3)如果数据的值可以很好地对应于某个分区,那么就可以考虑使用列表分区。
   在上面的原则基础上,再结合性能的影响因素,来最终确定使用哪种类型的分区。
   如果选择的分区不能确保各分区内数据量的基本平均,那么这种分区方式有可能是不恰当的。比如对于RANGE分区,假设分了10个分区,而其中一个分区中的记录数占总记录数的90%,其他9个分区只占总记录数的10%,则这个分区方式就起不到数据平衡的作用。
【答案解析】