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

如何将一个普通的非分区表进行分区2 Insert with a subquery 方法

原创 黑獭 2025-02-24
184

如何将一个普通的非分区表进行分区2 Insert with a subquery 方法

参考文档:

如何将一个普通的非分区表进行分区 (Doc ID 1985005.1)

第二种方式: 通过 Insert with a subquery 方法

  1. 创建一个分区表:

SQL>

CREATE TABLE tt (
a NUMBER, y number,
name VARCHAR2(100),date_used DATE)
PARTITION BY RANGE (date_used)
(PARTITION unpar_table_12 VALUES LESS THAN (TO_DATE(‘10/05/2015’, ‘DD/MM/YYYY’)),
PARTITION unpar_table_15 VALUES LESS THAN (TO_DATE(‘15/05/2015’, ‘DD/MM/YYYY’)),
PARTITION unpar_table_MX VALUES LESS THAN (MAXVALUE));

  1. 将原来非分区表中的数据通过子查询 insert 到新创建的分区表中(也可以抽取部分列):

SQL> insert into tt select * from unpar_table;

  1. 如果您想让新建的分区表与原表名相同,那么 drop 掉原来的非分区表然后重命名新表:

SQL> drop table unpar_table;
SQL> alter table tt rename to unpar_table;
您可以通过 direct path insert 和利用并行来改善 insert 的性能。如下的例子演示了如何实现并且如何从执行计划中来验证。

方式1 :传统的 insert

SQL> set autotrace on
SQL> insert into tt select * from unpar_table;

1002111 rows created.

Execution Plan


Plan hash value: 3460395448


| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |


| 0 | INSERT STATEMENT | | 1002K| 25M| 1395 (1)| 00:00:01 | | |
| 1 | LOAD TABLE CONVENTIONAL | TT | | | | | | |
| 2 | PARTITION RANGE ALL | | 1002K| 25M| 1395 (1)| 00:00:01 | 1 | 3 |
| 3 | TABLE ACCESS FULL | UNPAR_TABLE | 1002K| 25M| 1395 (1)| 00:00:01 | 1 | 3 |


方式2 : Direct load insert 方式

insert /+APPEND/ into tt select * from unpar_table;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, ‘ALLSTATS LAST’));


insert /+APPEND/ into tt select * from unpar_table

Plan hash value: 686678525


| Id | Operation | Name | ERows | OMem | 1Mem | UsedMem |


| 0 | INSERT STATEMENT | | | | | |
| 1 | LOAD AS SELECT | TT | | 2070K| 2070K| 2070K (0)|
| 2 | OPTIMIZER STATISTICS GATHERING | | 1002K| 256K| 256K| |
| 3 | PARTITION RANGE ALL | | 1002K| | | |
| 4 | TABLE ACCESS FULL | UNPAR_TABLE | 1002K| | | |


方式3 :Direct load insert 并且在查询部分开启并行

SQL> insert /+APPEND PARALLEL/ into tt select * from unpar_table;

insert /+APPEND PARALLEL/ into tt select * from unpar_table

Plan hash value: 1661748588


| Id | Operation | Name | ERows | OMem | 1Mem | UsedMem |


| 0 | INSERT STATEMENT | | | | | |
| 1 | LOAD AS SELECT | TT | | 2070K| 2070K| 2070K (0)|
| 2 | PX COORDINATOR | | | 73728 | 73728 | |
| 3 | PX SEND QC (RANDOM) | :TQ10000 | 1002K| | | |
| 4 | OPTIMIZER STATISTICS GATHERING | | 1002K| 256K| 256K| 512K (0)|
| 5 | PX BLOCK ITERATOR | | 1002K| | | |
|* 6 | TABLE ACCESS FULL | UNPAR_TABLE | 1002K| | | |



注意以上执行计划中 LOAD AS SELECT 在 PX COORDINATOR 的上面。

方式4 :Direct load insert 并且在查询部分和 insert 部分都开启并行

SQL> alter session enable parallel dml;
SQL> insert /+APPEND PARALLEL/ into tt select * from unpar_table;

insert /+APPEND PARALLEL/ into tt select * from unpar_table

Plan hash value: 139931203


| Id | Operation | Name | ERows | OMem | 1Mem | UsedMem |


| 0 | INSERT STATEMENT | | | | | |
| 1 | PX COORDINATOR | | | 73728 | 73728 | |
| 2 | PX SEND QC (RANDOM) | :TQ10000 | 1002K| | | |
| 3 | LOAD AS SELECT (HIGH WATER MARK BROKERED)| TT | | 2070K| 2070K| 2070K (0)|
| 4 | OPTIMIZER STATISTICS GATHERING | | 1002K| 256K| 256K| 512K (0)|
| 5 | PX BLOCK ITERATOR | | 1002K| | | |
|* 6 | TABLE ACCESS FULL | UNPAR_TABLE | 1002K| | | |


注意在以上执行计划中 LOAD AS SELECT 在 PX COORDINATOR 的下面。

方式5 :
另外一种可选的方式是直接通过 select 来创建新的分区表:一次性创建新的分区表并且加载数据。
执行计划同时显示 direct path load 并且 dml 以及 select 部分全部并行。

SQL> alter session enable parallel dml;

CREATE TABLE ttt ( a , y , name ,date_used ) PARTITION BY RANGE
(date_used) (PARTITION unpar_table_12 VALUES LESS THAN
(TO_DATE(‘10/05/2015’, ‘DD/MM/YYYY’)), PARTITION unpar_table_15 VALUES
LESS THAN (TO_DATE(‘15/05/2015’, ‘DD/MM/YYYY’)), PARTITION
unpar_table_MX VALUES LESS THAN (MAXVALUE)) as select /+PARALLEL/ *
from unpar_table

Plan hash value: 139931203


| Id | Operation | Name | ERows | OMem | 1Mem | UsedMem |


| 0 | CREATE TABLE STATEMENT | | | | | |
| 1 | PX COORDINATOR | | | 73728 | 73728 | |
| 2 | PX SEND QC (RANDOM) | :TQ10000 | 1002K| | | |
| 3 | LOAD AS SELECT (HYBRID TSM/HWMB)| TTT | | 2070K| 2070K| 2070K (0)|
| 4 | OPTIMIZER STATISTICS GATHERING | | 1002K| 256K| 256K| 128K (0)|
| 5 | PX BLOCK ITERATOR | | 1002K| | | |
|* 6 | TABLE ACCESS FULL | UNPAR_TABLE | 1002K| | | |


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

评论