`

Oracle的分区技术

阅读更多

Oracle的分区技术在某些条件下可以极大的提高查询的性能,所以被广泛采用。
从产品上说,分区技术是Oracle企业版中独立收费的一个组件。

以下是对于分区及本地索引的一个示例。

首先根据字典表创建一个测试分区表:

SQL> connect eygle/eygle
Connected.
SQL> CREATE TABLE dbobjs
  2  (OBJECT_ID        NUMBER NOT NULL,
  3  OBJECT_NAME      varchar2(128),
  4  CREATED          DATE  NOT NULL
  5  )
  6  PARTITION BY RANGE (CREATED)
  7  (PARTITION dbobjs_06 VALUES LESS THAN (TO_DATE('01/01/2007', 'DD/MM/YYYY')),
  8  PARTITION dbobjs_07 VALUES LESS THAN (TO_DATE('01/01/2008', 'DD/MM/YYYY')));

Table created.

SQL> COL segment_name for a20
SQL> COL PARTITION_NAME for a20
SQL> SELECT segment_name, partition_name, tablespace_name
  2    FROM dba_segments
  3  WHERE segment_name = 'DBOBJS';

SEGMENT_NAME        PARTITION_NAME      TABLESPACE_NAME
-------------------- -------------------- ------------------------------
DBOBJS              DBOBJS_06            EYGLE
DBOBJS              DBOBJS_07            EYGLE


创建一个Local索引,注意这里可以将不同分区的索引指定创建到不同的表空间:

SQL> CREATE INDEX dbobjs_idx ON dbobjs (created) LOCAL
  2  (PARTITION dbobjs_06 TABLESPACE users,
  3    PARTITION dbobjs_07 TABLESPACE users
  4    );

Index created.

这个子句可以进一步调整为类似:

CREATE INDEX dbobjs_idx ON dbobjs (created) LOCAL
(PARTITION dbobjs_06 TABLESPACE users,
  PARTITION dbobjs_07 TABLESPACE users
  ) TABLESPACE users;

通过统一的tablespace子句为索引指定表空间。 

SQL> COL segment_name for a20
SQL> COL PARTITION_NAME for a20
SQL> SELECT segment_name, partition_name, tablespace_name
  2    FROM dba_segments
  3  WHERE segment_name = 'DBOBJS_IDX';

SEGMENT_NAME        PARTITION_NAME      TABLESPACE_NAME
-------------------- -------------------- ------------------------------
DBOBJS_IDX          DBOBJS_06            USERS
DBOBJS_IDX          DBOBJS_07            USERS


SQL> insert into dbobjs
  2 select object_id,object_name,created
  3 from dba_objects where created <to_date('01/01/2008','dd/mm/yyyy') and object_id is not null; 

6227 rows created.

SQL> commit;

Commit complete.

SQL> select count(*) from dbobjs partition (DBOBJS_06);

  COUNT(*)
----------
      6154

SQL> select count(*) from dbobjs partition (dbobjs_07);

  COUNT(*)
----------
        73


我们可以通过查询来对比一下分区表和非分区表的查询性能差异:

SQL> set autotrace on
SQL> select count(*) from dbobjs where created < to_date('01/01/2008','dd/mm/yyyy');

  COUNT(*)
----------
      6227


Execution Plan
----------------------------------------------------------
  0      SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=9)
  1    0  SORT (AGGREGATE)
  2    1    PARTITION RANGE (ALL)
  3    2      INDEX (RANGE SCAN) OF 'DBOBJS_IDX' (NON-UNIQUE) (Cost=2 Card=8 Bytes=72)




Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
        25  consistent gets
          0  physical reads
          0  redo size
        380  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL> select count(*) from dbobjs where created < to_date('01/01/2007','dd/mm/yyyy');

  COUNT(*)
----------
      6154


Execution Plan
----------------------------------------------------------
  0      SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=9)
  1    0  SORT (AGGREGATE)
  2    1    INDEX (RANGE SCAN) OF 'DBOBJS_IDX' (NON-UNIQUE) (Cost=2 Card=4 Bytes=36)




Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
        24  consistent gets
          0  physical reads
          0  redo size
        380  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL> select count(distinct(object_name)) from dbobjs where created < to_date('01/01/2007','dd/mm/yyyy');

COUNT(DISTINCT(OBJECT_NAME))
----------------------------
                        4753


Execution Plan
----------------------------------------------------------
  0      SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=75)
  1    0  SORT (GROUP BY)
  2    1    TABLE ACCESS (BY LOCAL INDEX ROWID) OF 'DBOBJS' (Cost=1 Card=4 Bytes=300)
  3    2      INDEX (RANGE SCAN) OF 'DBOBJS_IDX' (NON-UNIQUE) (Cost=2 Card=1)




Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
        101  consistent gets
          0  physical reads
          0  redo size
        400  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed


对于非分区表的测试:

SQL> CREATE TABLE dbobjs2
  2  (object_id    NUMBER NOT NULL,
  3  object_name  VARCHAR2(128),
  4  created      DATE  NOT NULL
  5  );

Table created.

SQL> CREATE INDEX dbobjs_idx2 ON dbobjs2 (created);

Index created.

SQL> insert into dbobjs2
  2  select object_id,object_name,created
  3  from dba_objects where created <to_date('01/01/2008','dd/mm/yyyy') and object_id is not null;

6227 rows created.

SQL> commit;

Commit complete.

SQL> select count(distinct(object_name)) from dbobjs2 where created < to_date('01/01/2007','dd/mm/yyyy');

COUNT(DISTINCT(OBJECT_NAME))
----------------------------
                        4753


Execution Plan
----------------------------------------------------------
  0      SELECT STATEMENT Optimizer=CHOOSE
  1    0  SORT (GROUP BY)
  2    1    TABLE ACCESS (BY INDEX ROWID) OF 'DBOBJS2'
  3    2      INDEX (RANGE SCAN) OF 'DBOBJS_IDX2' (NON-UNIQUE)




Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
      2670  consistent gets
          0  physical reads
      1332  redo size
        400  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed


当增加表分区时,LOCAL索引被自动维护:

SQL> ALTER TABLE dbobjs
  2  ADD PARTITION dbobjs_08 VALUES LESS THAN (TO_DATE('01/01/2009', 'DD/MM/YYYY'));

Table altered.

SQL> set autotrace off
SQL> COL segment_name for a20
SQL> COL PARTITION_NAME for a20
SQL> SELECT segment_name, partition_name, tablespace_name
  2    FROM dba_segments
  3  WHERE segment_name = 'DBOBJS_IDX';

SEGMENT_NAME        PARTITION_NAME      TABLESPACE_NAME
-------------------- -------------------- ------------------------------
DBOBJS_IDX          DBOBJS_06            USERS
DBOBJS_IDX          DBOBJS_07            USERS
DBOBJS_IDX          DBOBJS_08            EYGLE

SQL> SELECT segment_name, partition_name, tablespace_name
  2    FROM dba_segments
  3  WHERE segment_name = 'DBOBJS';

SEGMENT_NAME        PARTITION_NAME      TABLESPACE_NAME
-------------------- -------------------- ------------------------------
DBOBJS              DBOBJS_06            EYGLE
DBOBJS              DBOBJS_07            EYGLE
DBOBJS              DBOBJS_08            EYGLE
分享到:
评论

相关推荐

    Oracle分区技术介绍

    Oracle分区技术是一种数据库管理系统(DBMS)特性,用于将大型表和索引分割成更小、更易管理和处理的部分,从而提升查询性能和数据管理效率。这种技术特别适用于数据仓库和决策支持系统(DSS),因为这些系统通常...

    oracle分区技术-大批量数据操作

    简单讲解了oracle分区技术-大批量数据操作

    oracle分区技术-大批量数据操作.ppt

    oracle分区技术-大批量数据操作,优化处理,大数据量的处理

    Oracle分区技术研究及实现.pdf

    Oracle分区技术研究及实现 Oracle分区技术是关系型数据库中的一种重要技术,用于解决大型表的使用和维护问题。本文对Oracle分区技术的概念、表分区、索引分区和分区策略进行了详细的介绍,并提供了实际应用示例。 ...

    oracle分区技术-大批量数据操作PPT课件.ppt

    Oracle 分区技术概述 Oracle 分区技术是 Oracle 数据库中的一种高级技术,用于解决大批量数据操作问题。该技术可以将大型表或索引分割成小的、独立的物理段,以提高数据的管理和查询效率。 分区技术的优点包括: ...

    Oracle分区技术和11g分区新特性

    ### Oracle分区技术和11g分区新特性 #### 数据分区的重要性 在现代信息技术环境中,随着企业规模的不断扩大和技术的快速发展,数据库中的数据量呈现爆炸性增长的趋势。这种趋势导致了一个非常现实的问题:如何有效...

    Oracle分区技术在LIS中的应用研究.pdf

    Oracle数据库作为一个强大且广泛使用的数据库管理系统,在处理大规模数据方面拥有许多高级特性,其中Oracle分区技术尤其值得关注。 Oracle分区技术是一种将大型表和索引拆分成较小、更易于管理的分区的方法。这些...

    oracle 分区技术-大批量数据操作

    oracle 分区技术-大批量数据操作 大数据对象 (表, 索引)被分成小物理段 当分区表建立时,记录基于分区字段值被存储到相应分区。 分区字段值可以修改。(row movement enabled) 分区可以存储在不同的表空间 分区可以...

    Oracle分区技术.pdf

    Oracle 分区技术.pdf Oracle 分区技术是 Oracle 数据库中的一种强大功能,自 1997 年的 Oracle 8.0 中首次引入。它可以提高应用程序的性能、可管理性和可用性。Oracle 数据库 11g 中引入了第 8 代分区,继续提供...

    Oracle分区技术

    ### Oracle分区技术详解 #### 一、分区技术概述 Oracle分区技术是一种用于管理和优化大型数据库的方法,通过将大型表或索引分割成更小、更易于管理的部分来提高查询性能和简化管理。这种技术尤其适用于那些包含...

    Oracle分区技术在C3无线接口监测系统中的应用.pdf

    【Oracle分区技术】 Oracle分区技术是Oracle数据库管理系统中一种高级的数据组织策略,旨在优化大规模数据管理,提升查询性能,以及简化数据库的维护工作。在Oracle中,分区将一个大的表或索引分解成多个较小、更易...

    基于ORACLE分区技术实现省级价格监测系统数据存储优化.pdf

    【Oracle分区技术】是Oracle数据库管理系统提供的一种高级数据管理策略,尤其适用于处理大规模数据的存储和查询优化。在省级价格监测系统中,由于涉及到的商品领域广泛、监测指标复杂,数据量巨大,传统的单一表管理...

    ORACLE分区技术

    ORACLE分区技术详述范围分区、哈希分区、列表分区、复合分区及分区索引处理海量数据

    oracle分区技术使用文档

    Oracle提供了分区技术以支持VLDB(Very Large DataBase)。将数据分散到各个分区中,减少了数据损坏的可能性;可以对单独的分区进行备份和恢复;可以将分区映射到不同的物理磁盘上,来分散IO ;提高可管理性、可用性和...

Global site tag (gtag.js) - Google Analytics