`

Oralce EXCHANGE PARTITION 的示例

 
阅读更多


--创建分区表
CREATE TABLE TEST(X INT,Y INT)
 PARTITION BY RANGE(X)
 (
 PARTITION PART0 VALUES LESS THAN (100),
 PARTITION PART1 VALUES LESS THAN (MAXVALUE)
);
--创建索引
CREATE INDEX IDX_TEST_X ON TEST(X) LOCAL;
CREATE INDEX IDX_TEST_Y ON TEST(Y);

--创建交换堆表
CREATE TABLE TMP_TEST(X INT, Y INT);
--创建索引
CREATE INDEX IDX_TMP_TEST_X ON TMP_TEST(X);


--初始化分区表数据
 BEGIN
 FOR I IN 1..200 LOOP
 INSERT INTO TEST VALUES(I,I-1);
 END LOOP;
 COMMIT;
 END;
--初始化堆表数据
BEGIN
FOR I IN 1..50 LOOP
INSERT INTO TMP_TEST VALUES(I,I-1);
END LOOP;
COMMIT;
END;

--查看表的元数据
SQL> SELECT OBJECT_NAME,
  2         SUBOBJECT_NAME,
  3         OBJECT_ID,
  4         DATA_OBJECT_ID,
  5         OBJECT_TYPE,
  6         STATUS
  7    FROM DBA_OBJECTS
  8   WHERE OBJECT_NAME IN ('TEST', 'TMP_TEST')
  9   ORDER BY OBJECT_NAME;

OBJECT_NAME          SUBOBJECT_NAME        OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE         STATUS
-------------------- -------------------- ---------- -------------- ------------------- -------
TEST                 PART1                     60040          60040 TABLE PARTITION     VALID
TEST                 PART0                     60039          60039 TABLE PARTITION     VALID
TEST                                                 60038                TABLE               VALID
TMP_TEST                                        60045          60045 TABLE               VALID

----索引的元数据
SQL> SELECT OBJECT_NAME,
  2  SUBOBJECT_NAME,
  3  OBJECT_ID,
  4  DATA_OBJECT_ID,
  5  OBJECT_TYPE,
  6  STATUS
  7  FROM DBA_OBJECTS
  8  WHERE OBJECT_NAME IN ('IDX_TEST_X', 'IDX_TEST_Y','IDX_TMP_TEST_X');

OBJECT_NAME          SUBOBJECT_NAME        OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE         STATUS
-------------------- -------------------- ---------- -------------- ------------------- ------
IDX_TMP_TEST_X                                 60047          60047 INDEX               VALID
IDX_TEST_Y                                     60044          60044 INDEX               VALID
IDX_TEST_X                                     60041                INDEX               VALID
IDX_TEST_X           PART0                     60042          60042 INDEX PARTITION     VALID
IDX_TEST_X           PART1                     60043          60043 INDEX PARTITION     VALID

--交换表及已有的索引
ALTER TABLE TEST EXCHANGE PARTITION PART0 WITH TABLE TMP_TEST INCLUDING INDEXES;


--查看数据已交换成功
SQL> SELECT COUNT(*) FROM TMP_TEST;

  COUNT(*)
----------
        99

SQL> SELECT COUNT(*) FROM TEST PARTITION(PART0);

  COUNT(*)
----------
        50
--查看表元数据的变化,可以得出结论exchange 只是交换的是数据段编号
SQL> SELECT OBJECT_NAME,
  2         SUBOBJECT_NAME,
  3         OBJECT_ID,
  4         DATA_OBJECT_ID,
  5         OBJECT_TYPE,
  6         STATUS
  7    FROM DBA_OBJECTS
  8   WHERE OBJECT_NAME IN ('TEST', 'TMP_TEST')
  9   ORDER BY OBJECT_NAME;

OBJECT_NAME          SUBOBJECT_NAME        OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE         STATUS
-------------------- -------------------- ---------- -------------- ------------------- -------
TEST                 PART1                     60040          60040 TABLE PARTITION     VALID
TEST                 PART0                     60039          60045 TABLE PARTITION     VALID
TEST                                                  60038                    TABLE               VALID
TMP_TEST                                        60045          60039 TABLE               VALID
--查看索引元数据的变化,可以看出index的变化:交换了段编号

SQL> SELECT OBJECT_NAME,
  2  SUBOBJECT_NAME,
  3  OBJECT_ID,
  4  DATA_OBJECT_ID,
  5  OBJECT_TYPE,
  6  STATUS
  7  FROM DBA_OBJECTS
  8  WHERE OBJECT_NAME IN ('IDX_TEST_X', 'IDX_TEST_Y','IDX_TMP_TEST_X','IDX_TMP_TEST_Y');

OBJECT_NAME          SUBOBJECT_NAME        OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE         STATUS
-------------------- -------------------- ---------- -------------- ------------------- -------
IDX_TMP_TEST_X                                  60047          60042   INDEX               VALID
IDX_TEST_Y                                           60044          60044   INDEX               VALID
IDX_TEST_X                                           60041                      INDEX               VALID
IDX_TEST_X           PART0                     60042          60047 INDEX PARTITION     VALID
IDX_TEST_X           PART1                     60043          60043 INDEX PARTITION     VALID
--查看索引的状态
--发现分区表TEST的GLOBAL索引已不可用,需要重新创建,Local的分区索引显示为N/A,我们需要查询另外一个视图来确定是否可用
--经测试在交换分区的时候 加上 update indexes 则可以避免GLobal索引失效的情况
SQL> SELECT INDEX_NAME,TABLE_NAME,STATUS FROM DBA_INDEXES WHERE TABLE_NAME IN ('TEST','TMP_TEST');

INDEX_NAME                     TABLE_NAME                     STATUS
------------------------------ ------------------------------ --------
IDX_TEST_X                     TEST                           N/A
IDX_TEST_Y                     TEST                           UNUSABLE
IDX_TMP_TEST_X                 TMP_TEST                       VALID
--LOCAL分区索引仍然是有效的
SQL>  SELECT INDEX_NAME,STATUS FROM USER_IND_PARTITIONS WHERE INDEX_NAME IN ('IDX_TEST_X');

INDEX_NAME                     STATUS
------------------------------ --------
IDX_TEST_X                     USABLE
IDX_TEST_X                     USABLE


一点在Oracle文档的摘抄:
http://docs.oracle.com/cd/B19306_01/server.102/b14231/partiti.htm#i1107555

 

When you exchange partitions, logging attributes are preserved.
You can optionally specify if local indexes are also to be exchanged (INCLUDING INDEXES clause),
and if rows are to be validated for proper mapping (WITH VALIDATION clause).

Note:
When you specify WITHOUT VALIDATION for the exchange partition operation,
this is normally a fast operation because it involves only data dictionary updates.
However, if the table or partitioned table involved in the exchange operation has a primary key or unique constraint enabled,
then the exchange operation will be performed as if WITH VALIDATION were specified in order to maintain the integrity
of the constraints.

To avoid the overhead of this validation activity,
issue the following statement for each constraint before doing the exchange partition operation:

ALTER TABLE table_name
DISABLE CONSTRAINT constraint_name KEEP INDEX
Then, enable the constraints after the exchange.

分享到:
评论

相关推荐

    ORACLE数据库中PARTITION的用法[文].pdf

    ORACLE数据库中PARTITION的用法[文].pdf

    oracle partition 深入讨论

    Oracle Partition 深入探讨 Oracle Partition 是一种数据库优化技术,它将大型表和索引分解为更小、更易管理的部分,称为分区。这一特性旨在解决支持非常大的表和索引时所面临的挑战。通过分区,可以对数据库对象...

    ORACLE TABLE PARTITION

    EXCHANGE PARTITION`语句交换分区。 5. 将`T`重命名为`T_OLD`。 6. 将`T_NEW`重命名为`T`。 - **优点**: - 效率极高,因为只涉及元数据的修改,无需实际复制数据。 - 可以通过检查`T_OLD`来确保数据完整性。 ...

    Oracle查询中OVER (PARTITION BY ..)用法

    Oracle查询中的`OVER (PARTITION BY ..)`是一个窗口函数,它允许我们在数据集上执行计算,但不是在整个结果集上,而是针对每个分区。这部分功能非常强大,可以用于复杂的分析和排序任务,尤其是在处理分组数据时。在...

    Oracle Partition分区详细总结.pdf

    ### Oracle Partition 分区详解 #### 一、表空间与分区表概念 在Oracle数据库中,**表空间**是数据文件的逻辑容器,用于组织和管理数据。它由一个或多个数据文件组成,其中包含了数据库的所有数据对象,如表、索引...

    oracle_partition_index.zip_partition

    本资料“oracle_partition_index.zip_partition”着重讨论了Oracle分区和索引的相关知识,下面将对这些主题进行详细解释。 一、Oracle分区 1. 分区概念:Oracle分区是将一个大表或索引分成多个较小、更易管理的...

    Oracle 8i Partition.rar

    Oracle 8i Partition.rar

    oracle partition table

    从提供的文件信息中,我们可以提取出关于Oracle分区表的相关知识点。这些知识点主要涉及分区表的概念、类型以及它们在数据管理和查询性能提升方面的作用。 首先,分区表是数据库中用于数据组织的一种机制。在Oracle...

    Oracle 语法之 OVER (PARTITION BY ..) 及开窗函数(转载)

    ### Oracle 语法之 OVER (PARTITION BY ..) 及开窗函数详解 #### 一、OVER (PARTITION BY ..) 概述 在Oracle数据库中,`OVER (PARTITION BY ...)` 是一种非常强大的功能,它允许用户在数据集上进行窗口操作。这在...

    PKG_ADD_PART_NEW4.zip_Oracle partition_oracle_自动创建分区表脚本

    "Oracle partition"是指Oracle数据库的分区特性,它允许数据库管理员将大表或索引根据特定的逻辑标准(如日期、范围、哈希等)划分为多个小块,每个部分称为一个分区。这种技术对于处理大量数据的系统尤其有用,因为...

    oracle分析函数在BI分析中应用事例

    Oracle分析函数在商业智能(BI)分析中扮演着至关重要的角色,它们允许用户对数据集进行复杂的计算和分析,而不必依赖多表联接或子查询。这些函数极大地提升了SQL查询的效率和灵活性,尤其在处理大数据量时。以下是...

    oracle-partition-handler:Oracle PLSQL 包基于声明性数据自动处理分区

    通过使用`oracle-partition-handler`,开发人员可以创建自定义的PL/SQL程序来自动化处理这些分区操作,包括创建、合并、分割、删除和重组织。 1. **分区的优势**: - **性能提升**:分区有助于提高查询速度,因为...

    spring-batch分区处理示例

    在本示例中,我们将深入探讨"spring-batch 分区处理示例"。 分区处理的核心概念是`Partitioner`,它负责将主要的处理任务划分为多个子任务,每个子任务都有自己的输入数据范围。在Spring Batch中,`Partitioner`是...

    Oracle9i中分区Partition的使用简介

    Oracle9i通过引入列表分区(List Partition),使得当前共有4种分区数据的方法,文中分别介绍了这四种分区方法:范围分区、Hash分区、复合分区、列表分区。

    Oracle分区表详解

    ### Oracle 分区表详解 #### 一、Oracle 分区简介 Oracle 的分区技术是一种用于管理和优化超大型表和索引的有效手段。通过将一个大型的表或者索引分割成多个较小且可管理的部分,分区技术能够显著提升数据库的性能...

    Oracle中rank,over partition函数的使用方法

    在Oracle数据库中,`RANK()`, `OVER()`, `PARTITION BY` 是窗口函数的重要组成部分,它们在数据处理和分析中发挥着至关重要的作用。本文将深入探讨这些函数的用法,通过实例来帮助理解它们的功能和应用场景。 首先...

    oracle 11g partitioning

    ### Oracle 11g Partitioning关键技术点解析 #### 一、Oracle 11g Partitioning概述 Oracle Database 11g Release 2 (11.2) 的分区功能(Partitioning)是数据库管理系统的一项重要特性,它允许用户将大型表或索引...

    Oracle分区表_(Partition_Table)_的创建及管理

    ### Oracle分区表(Partition Table)的创建及管理 #### 一、创建分区表 在Oracle数据库中,分区表是一种非常实用的技术,它能够通过将一个大表分割成多个更小的部分来提高查询性能和可管理性。根据不同的数据分布...

    row_number,根据多个字段过滤,partition by

    #### 2.3 SQL查询语句示例 具体到本案例中,可以使用如下SQL语句来实现需求: ```sql SELECT * FROM ( SELECT t.*, ROW_NUMBER() OVER (PARTITION BY name || idNumber || TO_CHAR(date, 'YYYYMMDD') ORDER BY id)...

Global site tag (gtag.js) - Google Analytics