`
lsh4894
  • 浏览: 105010 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle数据库中大数据查询优化问题--分区表的操作方法

 
阅读更多
Oracle数据库中分区表的操作方法

  摘要:在大量业务数据处理的项目中,可以考虑使用分区表来提高应用系统的性能并方便数据管理,本文详细介绍了分区表的使用。 

   在大型的企业应用或企业级的数据库应用中,要处理的数据量通常可以达到几十到几百GB,有的甚至可以到TB级。虽然存储介质和数据处理技术的发展也很快,但是仍然不能满足用户的需求,为了使用户的大量的数据在读写操作和查询中速度更快,Oracle提供了对表和索引进行分区的技术,以改善大型应用系统的性能。 

   使用分区的优点: 

   ·增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用; 

   ·维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可; 

   ·均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能; 

   ·改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。 

   Oracle数据库提供对表或索引的分区常见的方法有五种:
         ·范围分区 

   ·Hash分区(散列分区) 

   ·复合分区
 
        .列表分区
 
        .索引分区
          下面将以实例的方式分别对这三种分区方法来说明分区表的使用。为了测试方便,我们先建三个表空间。 

          

create tablespace dinya_space01 
datafile 'e:/demodata/dinya01.dnf' size 50M 
create tablespace dinya_space02 
datafile 'e:/demodata/dinya02.dnf' size 50M 
create tablespace dinya_space03 
datafile 'e:/demodata/dinya03.dnf' size 50M 

 
   1.1. 分区表的创建 

    1.1.1. 范围分区 

     范围分区就是对数据表中的某个值的范围进行分区,根据某个值的范围,决定将该数据存储在哪个分区上。如根据序号分区,根据业务记录的创建日期进行分区等。 

   需求描述:有一个物料交易表,表名:material_transactions。该表将来可能有千万级的数据记录数。要求在建该表的时候使用分区表。这时候我们可以使用序号分区三个区,每个区中预计存储三千万的数据,也可以使用日期分区,如每五年的数据存储在一个分区上。 

        根据交易记录的序号分区建表:
           
create table dinya_test 
 ( 
transaction_id number primary key, 
item_id number(8) not null, 
item_description varchar2(300), 
transaction_date date not null 
 ) 
 partition by range (transaction_id) 
 ( 
partition part_01 values less than(30000000) tablespace dinya_space01, 
partition part_02 values less than(60000000) tablespace dinya_space02, 
partition part_03 values less than(maxvalue) tablespace dinya_space03 
 ); 
         建表成功,根据交易的序号,交易ID在三千万以下的记录将存储在第一个表空间dinya_space01中,分区名为:par_01,在三千万到六千万之间的记录存储在第二个表空间:

   dinya_space02中,分区名为:par_02,而交易ID在六千万以上的记录存储在第三个表空间dinya_space03中,分区名为par_03. 

 

         根据交易日期分区建表:     

create table dinya_test 
 ( 
transaction_id number primary key, 
 item_id number(8) not null, 
 item_description varchar2(300), 
 transaction_date date not null 
 ) 
 partition by range (transaction_date) 
( 
 partition part_01 values less than(to_date(’2006-01-01’,’yyyy-mm-dd’)) 
tablespace dinya_space01, 
 partition part_02 values less than(to_date(’2010-01-01’,’yyyy-mm-dd’)) 
tablespace dinya_space02, 
 partition part_03 values less than(maxvalue) tablespace dinya_space03 
); 

     这样我们就分别建了以交易序号和交易日期来分区的分区表。每次插入数据的时候,系统将根据指定的字段的值来自动将记录存储到制定的分区(表空间)中。 


   当然,我们还可以根据需求,使用两个字段的范围分布来分区,如partition by range ( transaction_id ,transaction_date), 分区条件中的值也做相应的改变,请读者自行测试。

 

    1.1.2. Hash分区(散列分区) 

     散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在I/O设备上进行散列分区,使得这些分区大小一致。如将物料交易表的数据根据交易ID散列地存放在指定的三个表空间中:

      

create table dinya_test 
 ( 
transaction_id number primary key, 
item_id number(8) not null, 
 item_description varchar2(300), 
transaction_date date 
) 
partition by hash(transaction_id) 
( 
 partition part_01 tablespace dinya_space01, 
 partition part_02 tablespace dinya_space02, 
 partition part_03 tablespace dinya_space03 
); 

     建表成功,此时插入数据,系统将按transaction_id将记录散列地插入三个分区中,这里也就是三个不同的表空间中。 

 

     1.1.3. 复合分区 

 

     有时候我们需要根据范围分区后,每个分区内的数据再散列地分布在几个表空间中,这样我们就要使用复合分区。复合分区是先使用范围分区,然后在每个分区内再使用散列分区的一种分区方法,如将物料交易的记录按时间分区,然后每个分区中的数据分三个子分区,将数据散列地存储在三个指定的表空间中: 

     

create table dinya_test 
( 
transaction_id number primary key, 
item_id number(8) not null, 
item_description varchar2(300), 
transaction_date date 
) 
partition by range(transaction_date)subpartition by hash(transaction_id) 
subpartitions 3 store in (dinya_space01,dinya_space02,dinya_space03) 
 ( 
 partition part_01 values less than(to_date(’2006-01-01’,’yyyy-mm-dd’)), 
 partition part_02 values less than(to_date(’2010-01-01’,’yyyy-mm-dd’)), 
 partition part_03 values less than(maxvalue) 
); 

     该例中,先是根据交易日期进行范围分区,然后根据交易的ID将记录散列地存储在三个表空间中。

 

      1.1.3列表分区 

    当你需要明确地控制如何将行映射到分区时,就使用列表分区方法。可以在每个分区的描述中为该分区列指定一列离散值,这不同于范围分区,在那里一个范围与一个分区相关,这也不同于散列分区,在那里用户不能控制如何将行映射到分区。列表分区方法是特意为遵从离散值的模块化数据划分而设计的。范围分区或散列分区不那么容易做到这一点。进一步说列表分区可以非常自然地将无序的和不相关的数据集进行分组和组织到一起。

create table person(
PERSONNAME varchar2(200),
PERSONAGE number
)
 partition by list (PERSONNAME) 
 ( 
 partition s1 values ('北京'), 
 partition s2 values ('上海'), 
 partition s3 values (default) 
 ); 
  insert into person values('北京',222222222222222);
  insert into person values('上海',222222222222222);
  insert into person values('杭州',222222222222222);

  

 

  1.2. 分区表操作 

   以上了解了三种分区表的建表方法,下面将使用实际的数据并针对按日期的范围分区来测试分区表的数据记录的操作。 
          1.2.1. 插入记录: 
insert into dinya_test values(1,12,’BOOKS’,sysdate); 
insert into dinya_test values(2,12, ’BOOKS’,sysdate+30); 
insert into dinya_test values(3,12, ’BOOKS’,to_date(’2006-05-30’,’yyyy-mm-dd’)); 
insert into dinya_test values(4,12, ’BOOKS’,to_date(’2007-06-23’,’yyyy-mm-dd’));
insert into dinya_test values(5,12, ’BOOKS’,to_date(’2011-02-26’,’yyyy-mm-dd’)); 
insert into dinya_test values(6,12, ’BOOKS’,to_date(’2011-04-30’,’yyyy-mm-dd’)); 
 
   按上面的建表结果,2006年前的数据将存储在第一个分区part_01上,而2006年到2010年的交易数据将存储在第二个分区part_02上,2010年以后的记录存储在第三个分区part_03上。
 

1.2.2. 查询分区表记录: 


SQL> select * from dinya_test partition(part_01); 
TRANSACTION_ID ITEM_ID ITEM_DESCRIPTION TRANSACTION_DATE 
-------------------------------------------------------------------------------- 
1 12 BOOKS 2005-1-14 14:19: 
2 12 BOOKS 2005-2-13 14:19: 
SQL> 
SQL> select * from dinya_test partition(part_02); 
TRANSACTION_ID ITEM_ID ITEM_DESCRIPTION TRANSACTION_DATE 
-------------------------------------------------------------------------------- 
3 12 BOOKS 2006-5-30 
4 12 BOOKS 2007-6-23 
SQL> 
SQL> select * from dinya_test partition(part_03); 
TRANSACTION_ID ITEM_ID ITEM_DESCRIPTION TRANSACTION_DATE 
-------------------------------------------------------------------------------- 
5 12 BOOKS 2011-2-26 
6 12 BOOKS 2011-4-30 
SQL> 

   从查询的结果可以看出,插入的数据已经根据交易时间范围存储在不同的分区中。这里是指定了分区的查询,当然也可以不指定分区,直接执行select * from dinya_test查询全部记录。

   在也检索的数据量很大的时候,指定分区会大大提高检索速度。

 

  1.2. 分区表的维护

 

增加分区: 
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

   

分享到:
评论

相关推荐

    Oracle数据库介绍-2008-12-12及介绍Oracle常见的问题

    - **系统表空间(System Tablespace)**:默认情况下,Oracle会创建一个名为`SYSTEM`的表空间来存储数据库的所有核心元数据。 - **用户表空间(User Tablespace)**:用户创建的表和其他对象通常会被存储在这些自定义...

    Oracle数据库分区表操作方法

    Oracle数据库分区表操作方法 Oracle数据库中的分区表是将大型数据表分割成多个小表,以提高应用系统...Oracle数据库中的分区表操作方法可以提高应用系统的性能和方便数据管理,但需要根据实际情况选择合适的分区方法。

    Oracle数据库查询优化的方法

    Oracle数据库查询优化是数据库管理中的关键环节,它旨在提高数据检索速度,降低系统资源消耗,提升整体系统性能。本文将深入探讨Oracle数据库查询优化的各种方法和技术。 首先,我们从SQL语句的编写入手。良好的SQL...

    Oracle数据库中大型表查询优化的研究

    在Oracle数据库中,大型表查询优化是一个至关重要的主题,尤其对于处理海量数据的企业级应用而言。Oracle数据库以其高效、稳定和强大的功能著称,但在处理大规模数据时,如果不进行适当的优化,查询性能可能会显著...

    oracle数据库优化-分区共.pdf

    分区是Oracle数据库提供的一种高效管理超大型表和索引的方法。它将大表和索引分割成多个可管理的小块,以提高数据访问性能,减少管理时间,并通过并行处理增强系统可用性。 分区技术在Oracle 10g R2版本中支持四种...

    ORACLE数据库设计与优化

    《ORACLE数据库设计与优化》 Oracle数据库是全球广泛使用的大型关系型数据库系统之一,它在数据存储、处理和管理方面具有强大的功能。本主题主要探讨Oracle数据库的设计原则和优化策略,以提升系统的性能和效率。 ...

    Oracle数据库的查询优化

    ### Oracle数据库的查询优化 #### 一、何时需要考虑查询优化 在开发应用程序时,编写高效、优化的SQL语句对于提升系统性能至关重要。当遇到以下情况时,应该重点考虑查询优化: - **表连接**: 当查询涉及到多张表...

    基于Oracle数据库海量数据的查询优化研究.pdf

    本文主要探讨了 Oracle 数据库海量数据的查询优化研究,通过对 Oracle 数据库的分析,讨论了分页查询技术、SQL 语句优化、索引技术等查询优化方法,并对 Oracle 数据库的设计和实现进行了深入探析。 Oracle 数据库...

    ORACLE数据库优化-分区.pdf

    ORACLE数据库优化-分区.pdf

    ORACLE数据库SQL语句编写优化总结.rar

    这份"ORACLE数据库SQL语句编写优化总结"文档很可能是对如何提高SQL查询性能、减少资源消耗以及提升系统整体效率的详细阐述。以下是根据标题和描述推测的一些关键知识点: 1. **查询优化基础**: - **索引的使用**...

    Oracle表分区详解(优缺点)

    Oracle 表分区是一种高效的数据管理策略,用于处理大数据量的表,以提升查询性能和数据库的可维护性。本文将详细介绍Oracle表分区的概念、作用、优缺点,以及各种类型的分区和操作方法。 首先,理解表空间和分区表...

    oracle数据库性能优化.pdf

    Oracle数据库性能优化是确保系统高效运行的关键环节,尤其是在大数据量和高并发的环境中。Oracle数据库因其先进、完整和集成的特性,在市场中占据主导地位,因此深入理解和掌握Oracle的优化技术至关重要。 首先,...

    Oracle数据库中数据访问优化方法.pdf

    本文主要探讨了Oracle数据库中数据访问的优化方法,包括查询优化器的选择、全表扫描与索引扫描的适用场景以及相应的优化策略。 首先,Oracle数据库查询优化器在决定数据访问方式时,会综合考虑多种因素。全表扫描...

    Oracle Database 11g:数据库管理-课堂练习I .rar

    3. **性能优化**:通过分析SQL语句执行计划,调整索引,优化表分区,以及使用数据库调优顾问(DB Tuning Advisor)来提高查询效率。 4. **安全性管理**:设置用户权限,管理角色,以及使用审计功能确保数据安全。 5....

    oracle数据库操作手册

    本操作手册将深入探讨Oracle数据库的核心概念、安装配置、管理维护以及SQL查询等多个方面,帮助用户全面理解和掌握Oracle数据库的操作。 1. **Oracle数据库核心概念** - **数据库实例与数据库**:Oracle数据库实例...

    基于Oracle数据库海量数据的查询优化研究 (1).pdf

    在Oracle数据库中,面对海量数据的查询优化是一项关键任务。通过SQL语句优化、分区技术和索引技术的应用,可以显著提高查询效率,减少系统资源消耗。而分页查询技术则为处理大规模数据提供了有效的解决方案,确保...

    Oracle数据库优化之数据库磁盘IO

    在优化数据库磁盘IO时,需要监控数据库的性能,检查系统的I/O问题,使用V$FILESTAT确定oracle文件I/O的进程,分布I/O减少磁盘竞争,避免动态空间管理,确定动态扩展,分配分区,避免回滚段的动态空间管理,减少迁移...

Global site tag (gtag.js) - Google Analytics