织相关的数据集。
假设你使用下面语句创建了列表分区表list_sales。channel_id列就是这个分区表的分区key。
Example 4-3 List-Partitioned Table
CREATE TABLE list_sales
(prod_id NUMBER(6)
,cust_id NUMBER
,time_id DATE
, channel_id CHAR(1)
,promo_id NUMBER(6)
, quantity_sold NUMBER(3)
,amount_sold NUMBER(10,2)
)
PARTITION BY LIST (channel_id)
(PARTITION even_channels VALUES (2,4),
PARTITION odd_channels VALUES (3,9)
);
之后载入数据。下图显示了两个分区中数据的分布。数据库根据PARTITION BY LIST子句设置的规则,将每行根据其channel_id的值插入到相应的分区。
channel_id是2或者4的行,将存储到EVEN_CHANNELS分区。
channel_id是3或者9的行,将存储到ODD_CHANNELS分区。

Hash Partitioning(哈希分区)
在hash分区中,数据库根据 对指定的 分区键 进行hash运算后的值 创建分区。
每个行所处的位置 都由 指定列HASH后的值 所决定。
hash算法设计的目的,就是将行平均的分散到不同的分区。使得每个分区都能包含几乎相同数量的行。
Hash分区增强了表的可管理性,以前是管理一个超大表。现在可以对每个小部分进行单独管理。
一个HASH分区的丢失 不会影响到剩余的分区。而且这个分区可以单独被恢复。
Hash分区可以有效减少OLTP系统中的 更新争用
举个例子:通过将更新操作分散到 几个小segment 。
假设你使用了下列语句常见了hash_sales表,prod_id列是分区key。
CREATE TABLE hash_sales
(prod_id NUMBER(6)
,cust_id NUMBER
,time_id DATE
,channel_id CHAR(1)
,promo_id NUMBER(6)
,quantity_sold NUMBER(3)
,amount_sold NUMBER(10,2)
)
PARTITION BY HASH (prod_id)
PARTITIONS 2;
之后,加载进数据后,两个分区的数据分布可能如下,注意,这两个分区的名字是系统自动生成的:
你插入的行 ,数据库会努力将其 平均的,随机的分区到这些分区中。你无法指定 某行该插入哪个分区。数据库会执行hash函数,然后根据生成的值 决定该将这行放到哪个分区。
如果你改变了分区的数量(比如从2变成了3),这时数据库会对所有行进行重新分布,保证所有分区中都有基本相同数量的行。
Partitioned Tables(分区表)
一个分区表包括一个或多个分区。这些分区可以独立管理和操作。
一个表分为 分区表,非分区表。哪怕一个分区表 只包含一个分区,这个表也于非分区表不同.普通表没办法通过add命令增加分区.
一个分区表创建一个或多个segment.如果你创建一个名为hash_products的分区表,这时没有segment分配给它.直到分区中存入数据,这时候段才会被分配.每个分区segment包含一部分表的数据.
普通堆表的分区可以使用存储压缩特性..压缩可以节省空间以及加速查询速度.因此,压缩特性可以使用再数据仓库类似的环境(很少量的insert和update操作).
压缩特性可以定义在表空间,表,或者表分区级别.如果在表空间级别定义,则创建在这个表空间的表默认就是压缩的.你可以针对每个表进行修改这个特性,不过修改以后只对新插入的数据生效..一个表,或一个表分区 会同一时间既有压缩后的块,也有没压缩的块,它确保块不会因为压缩反而变大.如果压缩后的块反而变大,则数据库不会对这个块进行压缩.
Partitioned Indexes(分区索引)
分区索引,将一个索引拆分到多个可单独管理的部分.
Global indexes(全局索引):独立于分区表的定义进行分区。
Local indexes(局部索引):是自动根据表的分区定义进行索引。
和分区表一样,分区索引增强了 可管理型,可用性,性能以及扩展性。
下图显示了索引分区的可选项:

Local Partitioned Indexes(本地分区索引)
在本地分区索引,索引根据 分区表的 分区列 进行分区,相同的分区数量和相同的分区界限。索引分区与表分区相关联,这样存储在 索引分区中的key指向存储在一个表分区中的对应行。
在这种情况下,数据库会自动根据表分区中的数据 同步对应的索引分区,独立维护每个组合(一个表分区-一个索引分区)。
本地分区索引经常使用在数据仓库环境,本地分区索引有如下优势:
·可用性会增加。因为某个分区不可用只影响对应分区索引,对其他组合没有影响。
·维护起来更简单,当你move一个表分区,或者当一个分区中的数据删除,只有相对应的索引分区需要重建或者维护。如果是全局索引,则所有的索引分区必须都重建或维护。
·如果对一个表分区进行point-in-time recovery,则对应索引索引可以recover到对应的recover time。整个索引不需要进行重建。
hash_sales表根据prod_id进行hash分区,
下面语句对这个hash表的time_id列创建了一个本地索引。
CREATE INDEX hash_sales_idx ONhash_sales(time_id) LOCAL。
因为hash_sales表有两个分区,所以hash_sales_idx也有两个分区,每个索引分区关联不同的表分区。索引分区SYS_P38对表分区SYS_P33进行索引。而索引分区SYS_P39对表分区SYS_P34进行索引,如下图显示:

你没办法显式的增加一个索引分区。
一个索引分区的增加,只能是因为对应的分区表 增加了一个分区。
同样的,你也没办法显式的删除一个索引分区。
索引分区的删除,只能是因为对应分区表的 删除了一个分区
你也可以在分区表上创建bitmap索引。只有一个限制,那就是bitmap索引只能是本地索引。它不能是全局索引。全局bitmap索引只支持非分区表。
Local Prefixed andNonprefixed Indexes(前置索引或非前置索引)
本地分区索引分为以下类型:
·本地前置索引
这种类型,分区key包含在索引中,且在最前端。比如sales表根据time_id进行分区,一个本地前置索引在这个表,将会包含time_id列,且这个列在索引定义的最前列。
·本地非前置索引
这种类型,分区key没在索引的最前列,我们之前创建的hash_sales_idx这个索引,既是一个非前置索引,因为分区key product_id没有在索引中
这两种类型都可以 partition elimination(分区消除,也叫 partition pruning 分区剪裁),
当优化器访问数据时,认为有一些分区可以排除,则分区消除发生。一个查询可消除的分区取决于谓词(where).当一个查询使用前置索引