oracle 数据分区

xiaoxiao2024-03-26  27

数据库大数据量表的优化:1、采用蔟表(clustered tables)及蔟索引(Clustered Index)      蔟表和蔟索引是oracle所提供的一种技术,其基本思想是将几张具有相同数据项、并且经常性一起使用的表通过共享数据块(data block)的模式存放在一起。各表间的共同字段作为蔟键值(cluster key),数据库在访问数据时,首先找到蔟键值,以此同时获得若干张表的相关数据。蔟表所能带来的好处是可以减少I/O和减少存储空间.

2、采用表分区(partition)

     表分区技术是在超大型数据库(VLDB)中将大表及其索引通过分区(patition)的形式分割为若干较小、可治理的小块,并且每一分区可进一步划分为更小的子分区(sub partition)。而这种分区对于应用来说是透明的。通过对表进行分区,可以获得以下的好处:1)减少数据损坏的可能性。2)各分区可以独立备份和恢复,增强了数据库的可治理性。3)可以控制分区在硬盘上的分布,以均衡IO,改善了数据库的性能。蔟表与表分区技术的侧重点各有不同,前者侧重于改进关联表间查询的效率,而表分区侧重于大表的可治理性及局部查询的性能。

其中表分区技术:一、分区类型1、范围分区表:partition by rang(grade)( partition part1 values less then(50) tablespace Part1_tb, partition part2 values less then(MAXVALUE) tablespace Part2_tb); MAXVALUE是oracle的关键字 表示最大值2、列表分区表:partition by list (grade) (partition p1 values ('北京'), partition p2 values ('上海','天津','重庆'), partition p3 values ('广东','福建')partition p0 values (default));3、哈希分区:partition by hash (empno) partitions 8 -- 指定分区的数目store in (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8); --如果指定的分区数目比表空间多,分区会以循环方式分配到表空间

hash分区研究:    http://www.eygle.com/digest/2009/01/oracle_hash_partition.html4、组合分区:范围哈希组合分区:create table emp ( empno number(4), hiredate date) partition by range (hiredate) subpartition by hash (empno) subpartitions 2 (partition e1 values less than (to_date('20020501','YYYYMMDD')), partition e2 values less than (to_date('20021001','YYYYMMDD')), partition e3 values less than (maxvalue));范围列表组合分区:CREATE TABLE customers_part (customer_id NUMBER(6),cust_first_name VARCHAR2(20),cust_last_name VARCHAR2(20),nls_territory VARCHAR2(30),credit_limit NUMBER(9,2))

PARTITION BY RANGE (credit_limit)SUBPARTITION BY LIST (nls_territory)SUBPARTITION TEMPLATE (SUBPARTITION east VALUES ('CHINA', 'JAPAN', 'INDIA', 'THAILAND'),SUBPARTITION west VALUES ('AMERICA', 'GERMANY', 'ITALY', 'SWITZERLAND'),SUBPARTITION other VALUES (DEFAULT))(PARTITION p1 VALUES LESS THAN (1000),PARTITION p2 VALUES LESS THAN (2500),PARTITION p3 VALUES LESS THAN (MAXVALUE));create table t1 (id1 number,id2 number) partition by range (id1) subpartition by list (id2)(partition p11 values less than (11)(subpartition subp1 values (1)));

5、索引分区:CREATE INDEX month_ix ON sales(sales_month)GLOBAL PARTITION BY RANGE(sales_month)(PARTITION pm1_ix VALUES LESS THAN (2)PARTITION pm12_ix VALUES LESS THAN (MAXVALUE));--global为全局索引 全局索引可以包含多个分区的值 局部索引比全局索引容易管理,而全局索引比较快注意:不能为散列分区 或者 子分区创建全局索引二、分区表的维护:增加分区: ALTER TABLE sales ADD PARTITION sales2000_q1 VALUES LESS THAN (TO_DATE('2000-04-01’,’YYYY-MM-DD’) TABLESPACE ts_sale2000q1; 如果已有maxvalue分区,不能增加分区,可以采取分裂分区的办法增加分区!

删除分区: ALTER TABLE sales DROP PARTION sales1999_q1;

截短分区:alter table sales truncate partiton sales1999_q2;

合并分区:alter table sales merge partitons sales1999_q2, sales1999_q3 into sales1999_q23;alter index ind_t2 rebuild partition p123 parallel 2;

分裂分区: ALTER TABLE sales SPLIT PARTITON sales1999_q4 AT TO_DATE ('1999-11-01’,’YYYY-MM-DD’) INTO (partition sales1999_q4_p1, partition sales1999_q4_p2) ;alter table t2 split partition p123 values (1,2) into (partition p12,partition p3);

交换分区:alter table x exchange partition p0 with table bsvcbusrundatald ;

访问指定分区:select * from sales partition(sales1999_q2)

EXPORT指定分区: exp sales/sales_password tables=sales:sales1999_q1 file=sales1999_q1.dmp

IMPORT指定分区: imp sales/sales_password FILE =sales1999_q1.dmp TABLES = (sales:sales1999_q1) IGNORE=y

查看分区信息: user_tab_partitions, user_segments

 

三、把一个已存在数据的大表改成分区表:第一种(表不是太大):1.把原表改名:rename xsb1 to xsb2;2.创建分区表:CREATE TABLE xsb1PARTITION BY LIST (c_test) (PARTITION xsb1_p1 VALUES (1),PARTITION xsb1_p2 VALUES (2),PARTITION xsb1_p0 VALUES (default))nologging AS SELECT * FROM xsb2;3.将原表上的触发器、主键、索引等应用到分区表上;4.删除原表:drop table xsb2;第二种(表很大):1. 创建分区表:CREATE TABLE x PARTITION BY LIST (c_test) [range ()](PARTITION p0 VALUES [less than ](1) tablespace tbs1,PARTITION p2 VALUES (2) tablespace tbs1,PARTITION xsb1_p0 VALUES ([maxvalue]default))AS SELECT * FROM xsb2 [where 1=2];2. 交换分区 alter table x exchange partition p0 with table bsvcbusrundatald ;3. 原表改名alter table bsvcbusrundatald rename to x0;4. 新表改名alter table x rename to bsvcbusrundatald ;5. 删除原表drop table x0;6. 创建新表触发器和索引create index ind_busrundata_lp on bsvcbusrundatald(。。。) local tablespace tbs_brd_ind ;

或者:1. 规划原大表中数据分区的界限,原则上将原表中近期少量数据复制至另一表;2. 暂停原大表中的相关触发器;3. 删除原大表中近期数据;4. 改名原大表名称;5. 创建分区表;6. 交换分区;7. 重建相关索引及触发器(先删除之再重建).

参考脚本:select count(*) from t1 where recdate>sysdate-2create table x2 nologging as select * from t1 where recdate>trunc(sysdate-2)alter triger trg_t1 disabledelete t1 where recdate>sysdate-2commitrename t1 to x1create table t1 [nologging] partition by range(recdate)(partition pbefore values less than (trunc(sysdate-2)),partition pmax values less than (maxvalue))as select * from x1 where 1=2alter table t1 exchange partition pbefore with table x1alter table t1 exchange partition pmax with table x2drop table x2[重建触发器]drop table x1

 

分区技术能够提高数据库的性能:     由于减少了所检查或操作的数据数量,同时允许并行执行,Oracle9i 的分区功能提供了性能上的优势。这些性能包括:

    1 分区修整:分区修整是用分区技术提高性能的最简单最有价值的手段。分区修整常常能够将查询性能提高几个数量级。例如,假定应用程序中有包含定单历史记录的定单表,该表用周进行了分区。查询一周的定单只需访问该定单表的一个分区。如果该定单表包含两年的历史记录,这个查询只需要访问一个而不是一百零四个分区。该查询的执行速度因为分区修整而有可能快一百倍。分区修整能与所有其他 Oracle 性能特性协作。Oracle 公司将把分区修整技术与索引技术、连结技术和并行访问方法一起联合使用。

     2 分区智能联接:分区功能可以通过称为分区智能联接的技术提高多表联接的性能。当两个表要联接在一起,而且每个表都用联接关键字来分区时,就可以使用分区智能联接。分区智能联接将大型联接分解成较小的发生在各个分区间的联接,从而用较少的时间完成全部联接。这就给串行和并行的执行都能带来显著的性能改善。

l 更新和删除的并行执行:分区功能能够无限地并行执行 UPDATE、DELETE 与 MERGE 语句。当访问分区或未分区的数据库对象时Oracle 将并行处理 SELECT 与 INSERT 语句。当不使用位图索引时,也可以对分区或未分区的数据库对象并行处理 UPDATE、DELETE 和 MERGE 语句。为了对有位图索引的对象并行处理那些操作,目标表必须先分区。这些 SQL 语句的并行执行可以大大提高性能,特别是提高 UPDATE 与 DELETE 或 MERGE 操作涉及大量数据时的性能。

     3 分区技术提高可用性:

分区的数据库对象具有分区独立性。该分区独立性特点可能是高可用性战略的一个重要部分,例如,如果分区表的分区不能用,但该表的所有其他分区仍然保持在线并可用。那么这个应用程序可以继续针对该分区表执行查询和事务处理,只要不是访问那个不可用的分区,数据库操作仍然能够成功运行。 数据库管理员可以指定各分区存放在不同的表空间里,从而让管理员独立于其它表分区针对每个分区进行备份与恢复操作。 还有,分区功能可以减少计划停机时间。性能由于分区功能得到了改善,使数据库管理员在相对较小的批处理窗口完成大型数据库对象的维护工作。

 

  参考及其他oracle分区或大数据量表方案:

   ORACLE大表扫描--主动获得表更新信息: http://blog.csdn.net/rich1979/archive/2006/05/01/704081.aspx

   Oracle的在线重定义表功能(改为表分区): http://blog.itpub.net/post/468/12855 

   Oracle的性能调整的误区:                     http://www.searchdatabase.com.cn/ShowContent_15876.htm

 

 

 

 

转载请注明原文地址: https://www.6miu.com/read-5014530.html

最新回复(0)