Chinaunix首页 | 论坛 | 博客
  • 博客访问: 539934
  • 博文数量: 128
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 1345
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-22 21:43
文章分类

全部博文(128)

文章存档

2009年(30)

2008年(98)

我的朋友

分类: Oracle

2008-06-19 21:44:02

表达到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) |
给主人留下些什么吧!~~

chinaunix网友2008-06-20 12:40:56

什么都没有呢 http://www.itdatas.com 帮顶