ITPUB论坛 » Oracle数据库管理 » 一个超级大表转换为分区表 - 明天就要做了,高手帮忙,急呀~!
新一届的微软MVP评选已经开始,欢迎各位推荐!
2007-12-1 10:25 恋上你的狗
一个超级大表转换为分区表 - 明天就要做了,高手帮忙,急呀~!

dear all:

早上好啊,小弟有个棘手的问题要请教:

现有一个表t, 有20G的内容(oracle9i+hpunix的环境),由于当初设计上的问题,现在出现查询性能问题,要在每天停机维护时间将其改为分区表。
不知道怎么做是最简单,又快,又安全的?

我有两种做法如下,但从来没对这么大的表操作过,不知道哪种可行,或者还有没有更好的方法啊,高手指点呀:

方法一:利用原表重建分区表 -  但都说这种方式适合于数据量比较小的表操作,20G的数据这样做会怎么样呢?
步骤:
SQL> CREATE TABLE source_t_new (ID, TIME) PARTITION BY RANGE (TIME)
2 (PARTITION P1 VALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')),
3 PARTITION P2 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),
4 PARTITION P3 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),
5 PARTITION P4 VALUES LESS THAN (MAXVALUE))
6 AS SELECT * FROM source_t;
表已创建。
SQL> RENAME source_t TO source_t_old;
表已重命名。
SQL> RENAME source_t_new TO source_t;
表已重命名。

方法二: 用exp&imp的方式:

export t without index and constraint;
rename t to t_old;
create the table structure of t table with partition table;
import t to the database;
recreate the constraint, index and trigger and so on.

到底该怎么做呢,帮帮小弟呀,明天就要上战场了呀! 谢谢!

2007-12-1 10:38 dhcwenOra
用dbms_redefinition包,这个很好的

2007-12-1 10:43 microsoft_fly
你先去看下exchange partition,然后做个试验看看,如果满足你的要求,再到product db上执行,这个可能对你有用!

[[i] 本帖最后由 microsoft_fly 于 2007-12-1 10:44 编辑 [/i]]

2007-12-1 11:03 paulyibinyi
这几种方法都可以,测试下哪个速度最快,就选哪个

2007-12-1 11:19 恋上你的狗
[quote]原帖由 [i]dhcwenOra[/i] 于 2007-12-1 10:38 发表 [url=http://www.itpub.net/redirect.php?goto=findpost&pid=9089402&ptid=902794][img]http://www.itpub.net/images/common/back.gif[/img][/url]
用dbms_redefinition包,这个很好的 [/quote]
这个不是9i之后的功能吗?

2007-12-1 11:20 恋上你的狗
[quote]原帖由 [i]microsoft_fly[/i] 于 2007-12-1 10:43 发表 [url=http://www.itpub.net/redirect.php?goto=findpost&pid=9089424&ptid=902794][img]http://www.itpub.net/images/common/back.gif[/img][/url]
你先去看下exchange partition,然后做个试验看看,如果满足你的要求,再到product db上执行,这个可能对你有用! [/quote]

我记得交换分区好像只可以把数据转移到目标表的一个分区上吧?
但我希望原表可以按照时间顺序分布在目标表的不同分区中呀!

2007-12-1 20:24 seamanczg1984
20g的表很大了么,我们公司的表也有20多g的,但是速度蛮快的么,不知道楼主要求多高。

另外,你的这个问题,我也想知道,大表还是得分区啊。

2007-12-1 20:38 microsoft_fly
[quote]原帖由 [i]恋上你的狗[/i] 于 2007-12-1 11:20 发表 [url=http://www.itpub.net/redirect.php?goto=findpost&pid=9089582&ptid=902794][img]http://www.itpub.net/images/common/back.gif[/img][/url]


我记得交换分区好像只可以把数据转移到目标表的一个分区上吧?
但我希望原表可以按照时间顺序分布在目标表的不同分区中呀! [/quote]
先移上去再说,然后再拆分分区

2007-12-1 20:39 oradbHome
dbms_redefinition 在9201 也可以用的。

2007-12-1 20:41 oradbHome
不过20g的数据还是要测试好。要注意空间问题。

2007-12-1 21:02 zhang41082
回复 #9 oradbHome 的帖子

能停机就不要redefine,速度N慢,产生N多日志,感觉就是搞个临时表,然后把数据插入到分区临时表中,最后rename一下。唯一的就是redefine的时候对这个表的操作不会提示表不存在,估计是锁表,然后sql等待

2007-12-1 21:09 alantany
20g 用不了一个小时就搞定了。

2007-12-1 21:12 棉花糖ONE
oracle 都那套,为了避免锁表,就借住个中间表,最后再合并,rebuild online和dbms_redifinition 都一德性

2007-12-1 21:17 flyysy
本周三晚,由于突发状况,我们将一个29g的大表进行重建,重建过程可能会对你有所帮助。环境为oracle9i rac+hpunix。
首先将库停掉
重启数据库
停listener
导出表
改原表名
创建新表,我们的表分了15个区
导入表
建索引
建触发器
编译失效对象
启listener

exp需要30分钟,imp需要1个半小时,建索引一定要用并行度,否则速度极慢,采用并行度的5分钟就可以建好,主键我没有采用并行度结果用了50分钟,这个表还有两个分区索引,不采用并行度的需要1个小时,采用的用20多分钟。整个过程加上停启应用的时间共用7小时

大体过程和相应的时间就是这样  楼主可以估算一下。

2007-12-1 21:55 newjian
请问LS的,怎么用并行度建索引,用在rebuild索引上有效果吗?谢谢

2007-12-1 22:01 zergduan
alter index rebuild parallel 4;
create index .... parallel 4;

你有多少个CPU?

2007-12-1 22:03 ora110
标注一下,以后用得着。

2007-12-1 22:04 zergduan
并行对于索引的创建和重建可以提高效率,但会浪费一定空间,并且增加系统负荷。

2007-12-1 22:06 zhaolinjnu
首先你所反应的性能慢,是否能通过分区表解决问题?

这个要好好分析一下,找到产生问题的根本原因

从而找到解决问题的办法!

2007-12-1 22:20 flyysy
忘了加上: 最后一定要把并行度改回去 否则会影响系统性
并行度会对系统性能有影响 但毕竟时间对于我们来说是最重要的啊
cpu共有24颗  parallel=12

页: [1] 2 3


Powered by ITPUB论坛