设为首页 加入收藏

TOP

11GConcept第四章翻译Partitions,Views,andOtherSchemaObjects(分区,视图,以及其他SchemaObjects)(二)
2014-11-24 08:16:37 来源: 作者: 【 】 浏览:5
Tags:11GConcept 第四章 翻译 Partitions Views andOtherSchemaObjects (分区 视图 及其他 SchemaObjects
织相关的数据集。

假设你使用下面语句创建了列表分区表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).当一个查询使用前置索引

首页 上一页 1 2 3 4 5 6 下一页 尾页 2/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇linux操作系统下完全删除oracle数.. 下一篇Oracle分析表简介

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Redis on AWS:Elast (2025-12-27 04:19:30)
·在 Spring Boot 项目 (2025-12-27 04:19:27)
·使用华为开发者空间 (2025-12-27 04:19:24)
·Getting Started wit (2025-12-27 03:49:24)
·Ubuntu 上最好用的中 (2025-12-27 03:49:20)