
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论坛