一、创建测试表
CREATE TABLE par_test
( ID NUMBER,
NAME VARCHAR2(10),
cardid number
)
PARTITION BY RANGE (ID)
(PARTITION testP1 VALUES LESS THAN (1000)
TABLESPACE par1,
PARTITION testp2 VALUES LESS THAN (2000)
TABLESPACE par2,
PARTITION testp3 VALUES LESS THAN (3000)
TABLESPACE par3,
PARTITION testp4 VALUES LESS THAN (4000)
TABLESPACE par4
);
declare
begin
for i in 1..7999 loop
insert into par_test values(i,'test'||i,i+1);
if mod(i,1000)=0 then
commit;
end if;
end loop;
end;
/
SQL> COL SEGMENT_NAME FORMAT A12
select segment_name,partition_name,TABLESPACE_NAME from dba_segments where segment_name='PAR_TEST';
SEGMENT_NA PARTITION_NAME TABLESPACE_NAME
---------- ------------------------------ ------------------------------
PAR_TEST TESTP1 PAR1
PAR_TEST TESTP2 PAR2
PAR_TEST TESTP3 PAR3
PAR_TEST TESTP4 PAR4
SQL>
SQL> SELECT COUNT(*) FROM PAR_TEST PARTITION(TESTP1);
COUNT(*)
----------
999
SQL> SELECT COUNT(*) FROM PAR_TEST PARTITION(TESTP2);
COUNT(*)
----------
1000
SQL> SELECT COUNT(*) FROM PAR_TEST PARTITION(TESTP3);
COUNT(*)
----------
1000
SQL> SELECT COUNT(*) FROM PAR_TEST PARTITION(TESTP4);
COUNT(*)
----------
1000
CREATE INDEX IND_TESTPAR ON PAR_TEST (CARDID) LOCAL
(PARTITION testp1 TABLESPACE par1,
PARTITION testp2 TABLESPACE par2,
PARTITION testp3 TABLESPACE par3,
PARTITION testp4 TABLESPACE par4
);
SQL> COL SEGMENT_NAME FORMAT A12
SQL> select segment_name,partition_name,TABLESPACE_NAME from dba_segments where
segment_name='IND_TESTPAR';
SEGMENT_NAME PARTITION_NAME TABLESPACE_NAME
------------ ------------------------------ ------------------------------
IND_TESTPAR TESTP1 PAR1
IND_TESTPAR TESTP2 PAR2
IND_TESTPAR TESTP3 PAR3
IND_TESTPAR TESTP4 PAR4
SQL>
添加分区
ALTER TABLE par_test ADD PARTITION testp5 VALUES LESS THAN (5000);
====如果在建立分区的时候指定了MAXVALUE在添加分区的时候会报如下错误:
SQL> ALTER TABLE par_test ADD PARTITION testp6 VALUES LESS THAN (4000);
ALTER TABLE par_test ADD PARTITION testp6 VALUES LESS THAN (4000)
*
第 1 行出现错误:
ORA-14074: 分区界限必须调整为高于最后一个分区界限
解决办法:
检查HIGH_VALUS
SQL> select table_name,partition_name,high_value from dba_tab_partitions WHERE T
ABLE_NAME='PAR_TEST';
TABLE_NAME PARTITION_NAME
------------------------------ ------------------------------
HIGH_VALUE
--------------------------------------------------------------------------------
PAR_TEST TESTP
MAXVALUE
PAR_TEST TESTP1
1000
PAR_TEST TESTP2
2000
PAR_TEST TESTP3
3000
删除分区:
SQL> ALTER TABLE PAR_TEST DROP PARTITION TESTP;
表已更改。
结论:
在建立分区的时候可以先建立足够多的分区,否则如果指定了MAXVALUE则在添加分区的时候会出现这个问题。
添加分区:
SQL> ALTER TABLE par_test ADD PARTITION testp5 VALUES LESS THAN (5000);
表已更改。
SQL> select table_name,partition_name,high_value from dba_tab_partitions WHERE T
ABLE_NAME='PAR_TEST';
TABLE_NAME PARTITION_NAME
------------------------------ ------------------------------
HIGH_VALUE
--------------------------------------------------------------------------------
PAR_TEST TESTP1
1000
PAR_TEST TESTP2
2000
PAR_TEST TESTP3
3000
PAR_TEST TESTP4
4000
PAR_TEST TESTP5
5000
检查分区表和索引的状态:
SQL> select segment_name,partition_name,TABLESPACE_NAME from dba_segments where
2 segment_name='IND_TESTPAR';
SEGMENT_NAME PARTITION_NAME TABLESPACE_NAME
------------ ------------------------------ ------------------------------
IND_TESTPAR TESTP1 PAR1
IND_TESTPAR TESTP2 PAR2
IND_TESTPAR TESTP3 PAR3
IND_TESTPAR TESTP4 PAR4
IND_TESTPAR TESTP5 USERS
SQL> select segment_name,partition_name,TABLESPACE_NAME from dba_segments where
2 segment_name='PAR_TEST';
SEGMENT_NAME PARTITION_NAME TABLESPACE_NAME
------------ ------------------------------ ------------------------------
PAR_TEST TESTP1 PAR1
PAR_TEST TESTP2 PAR2
PAR_TEST TESTP3 PAR3
PAR_TEST TESTP4 PAR4
PAR_TEST TESTP5 USERS
SQL>
SQL> ALTER TABLE par_test ADD PARTITION testp6 VALUES LESS THAN (6000);
表已更改。
SQL> ALTER TABLE par_test ADD PARTITION testp7 VALUES LESS THAN (7000);
表已更改。
SQL> select segment_name,partition_name,TABLESPACE_NAME from dba_segments where
2 segment_name='IND_TESTPAR';
SEGMENT_NAME PARTITION_NAME TABLESPACE_NAME
------------ ------------------------------ ------------------------------
IND_TESTPAR TESTP1 PAR1
IND_TESTPAR TESTP2 PAR2
IND_TESTPAR TESTP3 PAR3
IND_TESTPAR TESTP4 PAR4
IND_TESTPAR TESTP5 USERS
IND_TESTPAR TESTP6 USERS
IND_TESTPAR TESTP7 USERS
已选择7行。
=====当增加表分区时,LOCAL索引被自动维护===============
SQL> select segment_name,partition_name,TABLESPACE_NAME from dba_segments where
2 segment_name='PAR_TEST';
SEGMENT_NAME PARTITION_NAME TABLESPACE_NAME
------------ ------------------------------ ------------------------------
PAR_TEST TESTP1 PAR1
PAR_TEST TESTP2 PAR2
PAR_TEST TESTP3 PAR3
PAR_TEST TESTP4 PAR4
PAR_TEST TESTP5 USERS
PAR_TEST TESTP6 USERS
PAR_TEST TESTP7 USERS
已选择7行。
===========创建全局索引=====================
CREATE INDEX IND_TESTPAR1 ON PAR_TEST (ID) global
partition by range(id)
(PARTITION testP1 VALUES LESS THAN (1000)
TABLESPACE par1,
PARTITION testp2 VALUES LESS THAN (2000)
TABLESPACE par2,
PARTITION testp3 VALUES LESS THAN (3000)
TABLESPACE par3,
PARTITION testp4 VALUES LESS THAN (4000)
TABLESPACE par4,
PARTITION testp5 VALUES LESS THAN (5000),
PARTITION testp6 VALUES LESS THAN (6000),
PARTITION testp7 VALUES LESS THAN (7000),
PARTITION otherp VALUES LESS THAN (maxvalue)
);
select segment_name,partition_name,TABLESPACE_NAME from dba_segments where
segment_name='IND_TESTPAR1';
合并分区操作:
SQL> alter table par_test merge partitions TESTP4,OTHERP into partition testp;
表已更改。
SQL> select segment_name,partition_name,TABLESPACE_NAME from dba_segments where
segment_name='PAR_TEST';
SEGMENT_NAME PARTITION_NAME TABLESPACE_NAME
------------ ------------------------------ ------------------------------
PAR_TEST TESTP1 PAR1
PAR_TEST TESTP2 PAR2
PAR_TEST TESTP3 PAR3
PAR_TEST TESTP4 PAR4
PAR_TEST TESTP USERS
SQL> SELECT COUNT(*) FROM PAR_TEST PARTITION(TESTP);
COUNT(*)
----------
3001
删除分区:
alter table par_test drop partition testp;
SQL> select segment_name,partition_name,TABLESPACE_NAME from dba_segments where
segment_name='PAR_TEST';
SEGMENT_NAME PARTITION_NAME TABLESPACE_NAME
------------ ------------------------------ ------------------------------
PAR_TEST TESTP1 PAR1
PAR_TEST TESTP2 PAR2
PAR_TEST TESTP3 PAR3
PAR_TEST TESTP4 PAR4
分区索引测试
SQL> set autotrace traceonly
SQL> select * from par_test where id=32;
执行计划
----------------------------------------------------------
Plan hash value: 827287693
--------------------------------------------------------------------------------
------------------------------------
| Id | Operation | Name | Rows | Bytes | Cos
t (%CPU)| Time | Pstart| Pstop |
--------------------------------------------------------------------------------
------------------------------------
| 0 | SELECT STATEMENT | | 2 | 66 |
3 (0)| 00:00:01 | | |
| 1 | PARTITION RANGE SINGLE | | 2 | 66 |
3 (0)| 00:00:01 | 1 | 1 |
| 2 | TABLE ACCESS BY GLOBAL INDEX ROWID| PAR_TEST | 2 | 66 |
3 (0)| 00:00:01 | 1 | 1 |
|* 3 | INDEX RANGE SCAN | IND_TESTPAR1 | 2 | |
1 (0)| 00:00:01 | 1 | 1 |
--------------------------------------------------------------------------------
------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("ID"=32)
Note
-----
- dynamic sampling used for this statement
统计信息
----------------------------------------------------------
9 recursive calls
0 db block gets
32 consistent gets
0 physical reads
0 redo size
558 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
2 rows processed
SQL> select * from par_test where cardid=3 and id=2;
执行计划
----------------------------------------------------------
Plan hash value: 43400626
--------------------------------------------------------------------------------
----------------------------------
| Id | Operation | Name | Rows | Bytes | Cost
(%CPU)| Time | Pstart| Pstop |
--------------------------------------------------------------------------------
----------------------------------
| 0 | SELECT STATEMENT | | 1 | 33 | 1
(0)| 00:00:01 | | |
| 1 | PARTITION RANGE SINGLE | | 1 | 33 | 1
(0)| 00:00:01 | 1 | 1 |
|* 2 | TABLE ACCESS BY LOCAL INDEX ROWID| PAR_TEST | 1 | 33 | 1
(0)| 00:00:01 | 1 | 1 |
|* 3 | INDEX RANGE SCAN | IND_TESTPAR | 1 | | 1
(0)| 00:00:01 | 1 | 1 |
--------------------------------------------------------------------------------
----------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("ID"=2)
3 - access("CARDID"=3)
Note
-----
- dynamic sampling used for this statement
统计信息
----------------------------------------------------------
5 recursive calls
0 db block gets
108 consistent gets
0 physical reads
0 redo size
557 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
2 rows processed
SQL> select * from par_test where id=2 and cardid=3;
执行计划
----------------------------------------------------------
Plan hash value: 43400626
--------------------------------------------------------------------------------
----------------------------------
| Id | Operation | Name | Rows | Bytes | Cost
(%CPU)| Time | Pstart| Pstop |
--------------------------------------------------------------------------------
----------------------------------
| 0 | SELECT STATEMENT | | 1 | 33 | 1
(0)| 00:00:01 | | |
| 1 | PARTITION RANGE SINGLE | | 1 | 33 | 1
(0)| 00:00:01 | 1 | 1 |
|* 2 | TABLE ACCESS BY LOCAL INDEX ROWID| PAR_TEST | 1 | 33 | 1
(0)| 00:00:01 | 1 | 1 |
|* 3 | INDEX RANGE SCAN | IND_TESTPAR | 1 | | 1
(0)| 00:00:01 | 1 | 1 |
--------------------------------------------------------------------------------
----------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("ID"=2)
3 - access("CARDID"=3)
Note
-----
- dynamic sampling used for this statement
统计信息
----------------------------------------------------------
4 recursive calls
0 db block gets
108 consistent gets
0 physical reads
0 redo size
557 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
2 rows processed
SQL>
重建分区索引:
alter index ind_testpar rebuild partition testp1 online;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7882490/viewspace-470531/ ,如需转载,请注明出处,否则将追究法律责任。