普通表转分区表Word文档格式.docx
《普通表转分区表Word文档格式.docx》由会员分享,可在线阅读,更多相关《普通表转分区表Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
![普通表转分区表Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/15/fc14a331-623b-4ebd-92e7-dc15ccb8e4b4/fc14a331-623b-4ebd-92e7-dc15ccb8e4b41.gif)
select
count(*)
from
dba;
COUNT(*)
----------
2713235
alter
session
set
nls_date_format='
yyyy-mm-dd
hh24:
mi:
ss'
;
会话已更改。
time_fee
dba
where
rownum<
5;
TIME_FEE
-------------------
2011-02-17
19:
29:
09
15
18
20
2.1.1Oracle11g的Interval
在11g里的Interval创建,这种方法对没有写全的分区会自动创建。
比如我这里只写了1月日期,如果插入的数据有其他月份的,会自动生成对应的分区。
/*
Formatted
on
2011/03/02
15:
41:
09
(QP5
v5.115.810.9015)
*/
CREATE
TABLE
intervaldave
PARTITION
BY
RANGE
(time_fee)
INTERVAL
(
NUMTOYMINTERVAL
(1,
'
MONTH'
)
)
(PARTITION
part1
VALUES
LESS
THAN
(TO_DATE
('
01/12/2010'
MM/DD/YYYY'
)))
AS
SELECT
ID,
TIME_FEE
FROM
DAVE;
table_name,partition_name
user_tab_partitions
table_name='
INTERVALDAVE'
TABLE_NAME
PARTITION_NAME
------------------------------
------------------------------
INTERVALDAVE
PART1
SYS_P24
SYS_P25
SYS_P26
SYS_P33
SYS_P27
SYS_P28
2.1.2Oracle10g版本
在10g里面,我需要写全所有的分区。
sql>
create
table
pdba
(id,
time)
partition
by
range
(time)
2
(partition
p1
values
less
than
(to_date('
2010-10-1'
yyyy-mm-dd'
)),
3
p2
2010-11-1'
4
p3
2010-12-1'
5
p4
(maxvalue))
6
as
id,
表已创建。
PDBA'
PDBA
P1
P2
P3
P4
(p1);
count(*)
1718285
(p2);
183667
(p3);
188701
(p4);
622582
现在分区表已经建好了,但是表名不一样,需要用rename对表重命名一下:
rename
dba_old;
表已重命名。
DBA'
DBA
2.2.交换分区:
Partitionexchangemethod
这种方法只是对数据字典中分区和表的定义进行了修改,没有数据的修改或复制,效率最高。
适用于包含大数据量的表转到分区表中的一个分区的操作。
尽量在闲时进行操作。
交换分区的操作步骤如下:
1.创建分区表,假设有2个分区,P1,P2.
2.创建表A存放P1规则的数据。
3.创建表B存放P2规则的数据。
4.用表A和P1分区交换。
把表A的数据放到到P1分区
5.用表B和p2分区交换。
把表B的数据存放到P2分区。
创建分区表:
p_dba
(id
number,time
date)
range(time)
(
2010-09-1'
))
7
);
注意:
我这里只创建了2个分区,没有创建存放其他数据的分区。
创建2个分别对应分区的基表:
dba_p1
id,time_fee
dba_old
WHERE
time_fee<
TO_DATE('
YYYY-MM-DD'
dba_p2
and
time_fee>
dba_p1;
1536020
dba_p2;
365932
讲2个基表与2个分区进行交换:
p_dba
exchange
with
表已更改。
查询2个分区:
partition(p1);
partition(p2);
数据和之前的基表一致。
查询原来的2个基表:
2个基表的数据变成成0。
在这里我们看一个问题,一般情况下,我们在创建分区表的时候,都会有一个其他分区,用来存放不匹配分区规则的数据。
在这个例子中,
我只创建了2个分区,没有创建maxvalue分区。
现在我来插入一条不满足规则的数据,看结果:
insert
into
values(999999,to_date('
2012-12-29'
'
));
*
第1行出现错误:
ORA-14400:
插入的分区关键字未映射到任何分区
2009-12-29'
已创建1行。
*
id=999999;
ID
TIME
----------
--------------
99999929-12月-09
999999
2009-12-29
00:
00
通过这个测试可以清楚,如果插入的数据不满足分区规则,会报ORA-144