暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

分区表-列表分区-散列分区简单说明

原创 不吃草的牛_Nick 2023-05-25
508

有时,你不想基于时间范围或者均匀分布的散列模式对数据进行分区,但是你知道像城市、地域或类似属性的值,那么当这些数据分布在一组离散值中时,使用列表分区(list partitioning)比使用范围或散列分区要好。例如,你想根据区域而非季度将公司的销售数据分组。列表分区可以按照与现实数据分组(而非时间范围或其他类似条件)同样的标准来分组数据。

在处理美国各州的总数据时,要处理50组不同的数据,在这种情况下可将数据分区为4个或5个区域(而不是使用范围方法按数据的字母顺序进行分区)更有意义。如何使用列表分区将ticket_sale表进行分区,其分区由start_city列给出的飞机起飞的城市分组组成。

创建列表分区表
CREATE TABLE sales_data
(
ticket_no NUMBER,
sale_year INT NOT NULL,
sale_month INT NOT NULL,
sale_day INT NOT NULL,
destination_city char(3),
start_city char(3)
)
PARTITION BY list(start_city)
(
PARTITION northeast_sales values ('NYC','BOS','PEN') TABLESPACE ts1,
PARTITION southwest_sales values ('DFW','ORL','HOU') TABLESPACE ts2,
PARTITION pacificwest_sales values ('SAN','LOS','WAS') TABLESPACE ts3,
PARTITION southeast_sales values ('MIA','CHA','ATL') TABLESPACE ts4
);

分区描述部分为start_city列指定了一列值。表的创建语句创建了4个列表分区.只有落在该列表中的城市才将包括在该分区中。标注为9999,2008,06,01,DFW,HOU信息的机票将存储在southwest_sales分区中。


散列分区

假设上例中的事务数据并不是均匀地分布在各季度之间。如果由于业务及季节的原因,大量的销售业务都发生在最后两个季度而前两个季度的销售业务基本可以忽略不计时该怎么办?此时,由于后两个季度分区儿乎保存了原始未分区表的全部数据,因此,范围分区只是在理论上行得通。

在这种情况中,最好使用散列分区(hash partitioning)模式。你必须做的是确定分区的数目,Oracle的散列算法将分配一个散列值给每个行的分区键并将其放在相应的分区中。除非数据未落入到某些容易确定的范围,否则你不必知道关于表中数据分布的任何事情。只要提供一个分区键就能创建散列分区,在下面给出的散列分区模式中此键为ticket_no列:
CREATE TABLE sales_data
(
ticket_no NUMBER,
sale_year INT NOT NULL,
sale_month INT NOT NULL,
sale_day INT NOT NULL
)
PARTITION BY HASH (ticket_no)
PARTITIONS 4
STORE IN (ts1,ts2,ts3,ts4);

4个散列分区在4个表空间中创建。我们并不知道2008年6月10日的数据存储在哪个分区中,Oracle将根据散列算法来决定存储,而你则不必去管理行-分区的映射。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论