接第一篇
http://blog.itpub.net/29827284/viewspace-2137006/,在数据库迁移完成后发现某些分区表在原库并没有分区,导致部分SQL语句执行效率变差。具体为什么会造成此问题,在网上包括MOS一直没找到答案,如果哪位大神碰到过这种情况且找到了答案,烦请帮忙解答,谢谢。以下通过实验进行生产环境的模拟。
原库导出库环境:
-
SELECT * FROM v$version;
-
BANNER
-
----------------------------------------------------------------
-
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Prod
-
PL/SQL Release 10.2.0.4.0 - Production
-
CORE 10.2.0.4.0 Production
-
TNS for 32-bit Windows: Version 10.2.0.4.0 - Production
-
NLSRTL Version 10.2.0.4.0 - Production
环境准备
-
//新建测试表
-
create table test(
-
id number,
-
workdate varchar2(10)
-
)
-
partition by range(workdate)(
-
partition p1 values less than('2015-01-01'),
-
partition p2 values less than('2016-01-01'),
-
partition p3 values less than(maxvalue)
-
);
-
//插入测试数据
-
insert into test values(1,'2013-01-01');
-
insert into test values(2,'2015-03-03');
-
insert into test values(3,'2016-09-01');
-
commit;
检查确认
-
SELECT * FROM test partition(p1);
-
ID WORKDATE
-
---------- ----------
-
1 2013-01-01
-
-
SELECT * FROM test partition(p2);
-
ID WORKDATE
-
---------- ----------
-
2 2015-03-03
-
-
SELECT * FROM test partition(p3);
-
ID WORKDATE
-
---------- ----------
-
3 2016-09-01
通过确认可以发现,插入的数据按照分区要求进行了相关的分区,3条测试数据按照要求插入到了3个不同的分区p1,p2,p3.
新库导入库环境:
-
SELECT * FROM v$version;
-
BANNER
-
--------------------------------------------------------------------------------
-
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
-
PL/SQL Release 11.2.0.3.0 - Production
-
CORE 11.2.0.3.0 Production
-
TNS for Linux: Version 11.2.0.3.0 - Production
-
NLSRTL Version 11.2.0.3.0 - Production
准备导入导出的dblink
-
CREATE DATABASE LINK "DMP_LINK" CONNECT TO "DZDZ" IDENTIFIED BY VALUES 'DZDZ' USING 'DZDZ_222'
设置network_link参数,从上述10g的原库导出测试表test到11g的新库服务器上,语句如下:
-
expdp dzdz/****** dumpfile=test.dump logfile=test.log directory=DATA_PUMP_DIR tables=test NETWORK_LINK=DMP_LINK
impdp导入,语句如下:
-
连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
-
With the Partitioning option
-
已成功加载/卸载了主表 "DZDZ"."SYS_IMPORT_FULL_01"
-
启动 "DZDZ"."SYS_IMPORT_FULL_01": dzdz
-
dzdz/******** dumpfile=test.dump logfile=test_impdp.log directory=DATA_PUMP_DIR
处理对象类型 TABLE_EXPORT/TABLE/TABLE
处理对象类型 TABLE_EXPORT/TABLE/TABLE_DATA
. . 导入了 "DZDZ"."TEST" 5.265 KB 3 行
作业 "DZDZ"."SYS_IMPORT_FULL_01" 已于 14:28:29 成功完成
确认导入的情况:
-
SELECT * FROM test;
-
ID WORKDATE
-
---------- ----------
-
1 2013-01-01
-
2 2015-03-03
-
3 2016-09-01
可以看到test的所有记录已经全部导入成功。下面验证分区的情况:
-
SELECT * FROM test partition(p1);
-
ID WORKDATE
-
---------- ----------
-
1 2013-01-01
-
2 2015-03-03
-
3 2016-09-01
-
-
SELECT * FROM test partition(p2);
-
未选定行
-
-
SELECT * FROM test partition(p3);
-
未选定行
可以看到数据并没有按照值导入到相应的分区,所有的数据都导入到了p1分区,由于没有按照值分区,可能会影响部分SQL语句的执行效率。
【总结】
对于分区表的导入操作建议关注其导入过程,输出日志情况如下说明数据已分区。
. . imported "SCOTT"."TEST":"P1" 5.234 KB 1 rows
. . imported "SCOTT"."TEST":"P2" 5.234 KB 1 rows
. . imported "SCOTT"."TEST":"P3" 5.234 KB 1 rows
如果输出日志如下说明表并没有分区,建议查找原因。
. . 导入了 "DZDZ"."TEST" 5.265 KB 3 行
除关注日志外,导入完成后建议检查表的数据分区情况以确认数据按照指定进行分区。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29827284/viewspace-2137277/
,如需转载,请注明出处,否则将追究法律责任。