表达到10G,如果不分区,重建索引,将是一个非常耗时和耗费空间的操作
如果分成10个分区,可以单独对每个分区进行重建索引操作,只需要1G的空间。
使用分区的原因:
为了提高可用性
为了减轻管理负担
为了提高DML和查询操作的性能
1.建立两个分区的散列分区表,每个分区在一个单独的表空间中。
# 建立两个表空间
create tablespace p1
datafile 'D:\oracle\product\10.2.0\oradata\p\p1.dbf'
size 100M autoextend on
next 50M
maxsize unlimited
extent management local
segment space management manual;
create tablespace p2
datafile 'D:\oracle\product\10.2.0\oradata\p\p2.dbf'
size 100M autoextend on
next 50M
maxsize unlimited
extent management local
segment space management manual;
# 建立分区表
create table emp
(empno int,
ename varchar2(2)
)
partition by hash(empno)
(partition part_1 tablespace p1,
partition part_2 tablespace p2);
# 插入测试数据
SQL> insert into emp select empno, ename from scott.emp;
12 rows inserted
# 查看分区的数据
SQL> column empno format a10
SQL> select * from emp partition(part_1);
EMPNO ENAME
---------- --------------------
7369 SMITH
7499 ALLEN
7654 MARTIN
7698 BLAKE
7782 CLARK
7839 KING
7934 MILLER
7 rows selected
SQL> select * from emp partition(part_2);
EMPNO ENAME
---------- --------------------
7521 WARD
7566 JONES
7844 TURNER
7900 JAMES
7902 FORD
# 让一个表空间脱机
# 说明:不访问脱机的表空间的查询任务正常运行-Oracle将从考虑中排除那个脱机的分区
SQL> conn / as sysdba
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as SYS
SQL> alter tablespace p1 offline;
SQL> select * from emp;
select * from emp
ORA-00376: 此时无法读取文件 6
ORA-01110: 数据文件 6: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\P\P1.DBF'
SQL> variable n number;
SQL> exec :n := 7844;
PL/SQL procedure successfully completed
n
---------
7844
SQL> select * from emp where empno = :n;
EMPNO ENAME
---------- --------------------
7844 TURNER
n
---------
7844
# 分区对于处理行链接(chained)行的优势
可以一个一个地重构每一个分区,如果不非高峰时时,可以在不同的会话中并行地运行ALTER TABLE MOVE语句
# 分区增强DML和查询的性能
增强的DML性能指的是执行并行DML(或PDML)的可能。
与并行查询不同,PDML需要对表进行分区(有一个特殊性况不需要分区,即并行的、通过/*+ APPEND*/提示的直接路径插入)。
如果没有对表进行分区,就不能并行地执行这些操作。
SQL> select saddr, sid, serial#, qcsid from v$px_session where qcsid = 159;
未选定行
SQL> select saddr, sid, serial#, qcsid from v$px_session where qcsid = 159;
SADDR SID SERIAL# QCSID
-------- ---------- ---------- ----------
1EB310C4 147 31 159
1EB2D86C 144 10 159
1EB2EB34 145 29 159
1EB33654 149 51 159
1EB3F224 159 11 159
# 对于分区表t2并行插入的时间差值
# 基中t2分为两个区
# 建立分区表T2
CREATE TABLE T2
( OWNER VARCHAR2(30) NOT NULL ENABLE,
OBJECT_NAME VARCHAR2(30) NOT NULL ENABLE,
SUBOBJECT_NAME VARCHAR2(30),
OBJECT_ID NUMBER NOT NULL ENABLE,
DATA_OBJECT_ID NUMBER,
OBJECT_TYPE VARCHAR2(19),
CREATED DATE NOT NULL ENABLE,
LAST_DDL_TIME DATE NOT NULL ENABLE,
TIMESTAMP VARCHAR2(19),
STATUS VARCHAR2(7),
TEMPORARY VARCHAR2(1),
GENERATED VARCHAR2(1),
SECONDARY VARCHAR2(1)
)
PARTITION BY HASH(OWNER)
(PARTITION PART_3 TABLESPACE P1,
PARTITION PART_4 TABLESPACE P2);
SQL> insert into t2 select * from sample; # 并行插入
已创建1122304行。
已用时间: 00: 00: 12.09
SQL> insert into t2 select * from sample1; # 非并行插入
已创建2244608行。
已用时间: 00: 00: 25.92
#############################
# t2分三个区,效率不升反降 #
#############################
SQL> insert into t2 select * from sample;
已创建1122304行。
已用时间: 00: 00: 18.35
所以并行与CPU的数目有关机,当前机器的CPU数目为2
阅读(1279) | 评论(1) | 转发(0) |