首页 > 数据库 > Oracle > 普通表自动转化为按月分区表的脚本
最近我们项目组遇到非常多张表需要改造为按月分区的分区表,而且有的表非常大,这个时候该如何做最快呢?
方法1
CREATE出所有的表,把原表TAB_OLD的建表脚本拿出来,改改后,建出新的分区表的表结构,如TAB_NEW
然后把TAB_OLD INSERT INTO 到TAB_NEW中(考虑并行和NOLOGGING),然后把TABLE_OLD RENAME TABLE_BK,把TAB_NEW RENAME 为TAB_OLD
优点:由于新表是根据脚本来建的,COMMENTS,DEFAULT值,PK,CHECK,NULL,外键等属性都是全的。
缺点1:找出所有的脚本,然后手工把结构建出来,写成分区表的动作步骤好繁琐!这个问题视乎难以避免,其实不然。
缺点2:执行非常慢,因为INSERT INTO是最慢的,可能是噩梦
方法2
直接用CREATE TABLE TAB_NEW (PARTITION ....) AS SELECT * FROM TAB_OLD的方式(考虑并行和NOLOGGING)
优点:CTAS是最快的,比方法1的INSERT INTO快了许多倍!
缺点:由于新表是不是脚本来建后,在从原表导数据的方案,COMMENTS,DEFAULT值,PK,CHECK,NULL,外键等属性都是没有,
这些都需要手工来完成,如果涉及到几十张的大表改造,将非常繁琐,而且极容易因为疏忽而导致漏了将上面的属性加进新表中。
方法3
仍然选择CTAS的方式改造分区,兼顾了方法2的优点,只是这些新表的属性利用ORACLE的数据字典获取非手动来做,不再麻烦了,我们可以通过写一个程序读取各个数据字典的信息来暗地里悄悄的获取到,把方法1的第1个缺点也避免了。
由此分析可以得知,方法3是同时拥有方法1和方法2的优点,而避免了他们的共同的缺点,在大量分区表改造的方案中,这个是最快的,其实即便只有一张表需要改造,用脚本也是安全的。
下面来看看我写的方法3的脚本
(由于分区表改造后,索引涉及到是选择LOCAL还是全局的问题,还有就是索引是否是必须的问题,所以新表的索引我就不考虑自动建了,另外外键由于涉及到依赖表必须存在,否则会出错,为了安全起见,我外键也不自动建了,另外外键自动建的脚本也比较难写些,呵呵,还没构造好,必要性不是太大,所以还没认真投入)
CTAS后,我保证了tab comments ,col comments ,check,DEFAULT ,PK,null,这6大属性一定必须要有!程序也考虑了NOLOGGING和PARALLEL最终转化成普通的LOGGING和NOPARALLEL
暂时不提供自动有索引和REFERENCE,索引没上面的关键,属于更加枝节,而且是否是全局索引还是局部索引有待考察,而REFERENCE虽然重要,但是可能由于在改造中引用表还没建好而报错,因此这2大属性,可以让开发人员手工选择性的最后判断在上述都完成后,来决定新表如何增加
另:输入的表名小写皆可,代码中统一转换为UPPER
【通用脚本分享】普通表自动转化为按月分区表的脚本
http://www.itpub.net/thread-1349399-1-1.html
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/642366/viewspace-1067040/ ,如需转载,请注明出处,否则将追究法律责任。