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

Oracle 哈希分区

askTom 2016-07-21
181

问题描述

汤姆,

我在不同分区之间的数据分布有问题。

示例:

创建表t
按哈希 (X) 划分 (
分区32
储存在 (VRI)
作为
(SELECT C作为T ( ds.X 作为 VARCHAR2 (20))作为 X,
来自测试ds );
)
/

在这里,ds.x包含唯一的记录,当我执行此脚本时,所有记录都存储在一个分区下,而不是所有32个不同的分区。

同样,当我插入具有不同唯一编号的任何新记录 (以上执行完成后) 时,它可以工作并经过不同的分区。

非常感谢您的帮助。

拉杰夫。

嗨,
让我详细说明一下,也包括我对此的分析。
I am creating a table using CT作为 with only one column X having dataype VARCHAR2(20). This is one simple table and not nested one.
示例如下:
创建表test1
NOLOGGING
PARTITION BY H作为H (X)
(分区第 _ 1部分
表空间VRI,
分区第2部分
表空间VRI,
分区第3部分
表空间VRI,
分区部分 _ 4
表空间VRI,
分区部分 _ 5
表空间VRI,
分区部分 _ 6
表空间VRI,
分区部分 _ 7
表空间VRI,
分区部分 _ 8
TABLESPACE VRI) 作为 (SELECT C作为T ( ds.X 作为 VARCHAR2(20))作为 X
来自测试ds,其中rownum<= 50000);

表test1从表 “测试” 中检索记录,该表具有类似的配置 (分区编号和类型),其列也具有主键约束。

我的分析:

名为test的表在所有分区中具有数据,如
PART_1 -100000记录
第2部分-100005记录
----- PART_8 100000记录

当我执行上述操作时,将过滤器设置为rownum<= 50000,尽管我知道它从表 “test” 的PART_1中获取记录
执行后,所有记录都存储在表 “test1” 的PART_1中

我的问题是,为什么oracle不会在表 “test1” 中的所有8个分区中分散记录?
它如何记住表 “测试” 的分区名称。

同样,如果我从表 “test” 的PART_4中获取记录,则存储在表 “test1” 的PART_4中。

非常感谢您的帮助。

拉杰夫



专家解答

无论如何,测试中的X是:

-长于20个字符
-带有固定/通用的起始字符串



如果是这样,您对varchar2(20) 的演员表将默默地修剪其余字符。因此,所有行都将具有相同的值,并最终在相同的分区中!

create table t as
  select lpad(rownum, 32, '0') x from dual connect by level <= 1000;
 
create table t1 partition by hash (x) partitions 8 as
  select cast(x as varchar2(20)) x from t;

select x, count(*) from t1 group by x;

X                     COUNT(*)  
00000000000000000000  1,000 

select uo.subobject_name, count(*)
from   t1 t, user_objects uo
where  dbms_rowid.rowid_object(t.rowid) = uo.data_object_id
group  by uo.subobject_name
order  by 1;

SUBOBJECT_NAME  COUNT(*)  
SYS_P16916      1,000 

如果不是这样,请提供一个脚本,显示如何为源表 (测试) 生成数据。当强制转换不修剪数据时,这些值对我来说分布在分区上很好:

drop table t purge;
drop table t1 purge;

create table t as
  select rownum x from dual connect by level <= 1000;
 
create table t1 partition by hash (x) partitions 8 as
  select cast(x as varchar2(20)) x from t;

select uo.subobject_name, count(*)
from   t1 t, user_objects uo
where  dbms_rowid.rowid_object(t.rowid) = uo.data_object_id
group  by uo.subobject_name
order  by 1;

SUBOBJECT_NAME  COUNT(*)  
SYS_P16919      130       
SYS_P16920      136       
SYS_P16921      114       
SYS_P16922      98        
SYS_P16923      121       
SYS_P16924      140       
SYS_P16925      145       
SYS_P16926      116

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

评论