`

Oracle创建分区索引总结

 
阅读更多

全局索引
============
CREATE INDEX month_ix ON sales(sales_month)

本地索引
============
CREATE INDEX loc_dept_ix ON dept(deptno) LOCAL;

全局分区索引
============
CREATE INDEX month_ix ON sales(sales_month)
   GLOBAL PARTITION BY RANGE(sales_month)
      (PARTITION pm1_ix VALUES LESS THAN (2)
       PARTITION pm2_ix VALUES LESS THAN (3)
       PARTITION pm3_ix VALUES LESS THAN (4)
       PARTITION pm4_ix VALUES LESS THAN (5)
       PARTITION pm5_ix VALUES LESS THAN (6)
       PARTITION pm6_ix VALUES LESS THAN (7)
       PARTITION pm7_ix VALUES LESS THAN (8)
       PARTITION pm8_ix VALUES LESS THAN (9)
       PARTITION pm9_ix VALUES LESS THAN (10)
       PARTITION pm10_ix VALUES LESS THAN (11)
       PARTITION pm11_ix VALUES LESS THAN (12)
       PARTITION pm12_ix VALUES LESS THAN (MAXVALUE));

分区表和一般表一样可以建立索引,分区表可以创建局部索引和全局索引。当分区中出现许多事务并且要保证所有分区中的数据记录的唯一性时采用全局索引。
3.1     局部索引分区的建立:
SQL> create index dinya_idx_t on dinya_test(item_id)
  2  local
  3  (
  4     partition idx_1 tablespace dinya_space01,
  5     partition idx_2 tablespace dinya_space02,
  6     partition idx_3 tablespace dinya_space03
  7  );

Index created.


3.2     全局索引分区的建立。
全局索引建立时global 子句允许指定索引的范围值,这个范围值为索引字段的范围值:
SQL> create index dinya_idx_t on dinya_test(item_id)
  2  global partition by range(item_id)
  3  (
  4     partition idx_1 values less than (1000) tablespace dinya_space01,
  5     partition idx_2 values less than (10000) tablespace dinya_space02,
  6     partition idx_3 values less than (maxvalue) tablespace dinya_space03
  7  );

Index created.

        本例中对表的item_id字段建立索引分区,当然也可以不指定索引分区名直接对整个表建立索引,如:
SQL> create index dinya_idx_t on dinya_test(item_id);

Index created.

一,分区索引分为2类:
1、global,它必定是Prefix的。不存在non-prefix的
2、local,它又分成2类:
  2.1、prefix:索引的第一个列等于表的分区列。
  2.2、non-prefix:索引的第一个列不等于表的分区列。

  
LOCAL的索引只能是表的分区方式,不能自己写分区方式。他们是EQUI-Partition的。GLOBAL索引可以不分区,这个时候就是普通的一个索引。同一个列只能只有一个索引,这个列可以是GLOBAL或者是LOCAL的索引。如果唯一索引所在的列不是表的分区列,只能建立GLOBAL索引。

例如:分区表
create table test (id number,data varchar2(100))
partition by RANGE (id)
(
partition p1 values less than (10000) ,
partition p2 values less than (20000) ,
partition p3 values less than (maxvalue) 
);

在ID列上创建一个LOCAL的索引
create index id_local on test(id) local;

SQL> select INDEX_NAME,PARTITION_NAME,HIGH_VALUE,STATUS from dba_ind_partitions where index_name='ID_LOCAL';

INDEX_NAME                    PARTITION_NAME                HIGH_VALUE          STATUS
------------------------------ ------------------------------ -------------------- --------
ID_LOCAL                      P1                            10000                USABLE
ID_LOCAL                      P2                            20000                USABLE
ID_LOCAL                      P3                            MAXVALUE            USABLE
从上面可以看出索引的分区和表一样,即是EQUI-PARTITION

如果我在表上增加个分区,则Oracle会自动维护分区的索引,注意此时加分区必须是用split,直接加会出错的。例如:
SQL> alter table test add partition p4 values less than (30000);
alter table test add partition p4 values less than (30000)
                              *
ERROR at line 1:
ORA-14074: partition bound must collate higher than that of the last partition


SQL> alter table test split partition p3 at (30000) into (partition p3, partition p4);

Table altered.

SQL> select INDEX_NAME,PARTITION_NAME,HIGH_VALUE,STATUS from dba_ind_partitions where index_name='ID_LOCAL';

INDEX_NAME                    PARTITION_NAME                HIGH_VALUE          STATUS
------------------------------ ------------------------------ -------------------- --------
ID_LOCAL                      P1                            10000                USABLE
ID_LOCAL                      P2                            20000                USABLE
ID_LOCAL                      P3                            30000                USABLE
ID_LOCAL                      P4                            MAXVALUE            USABLE

 

SQL> select INDEX_NAME,INDEX_TYPE,TABLE_NAME from dba_indexes where index_name='ID_LOCAL';

INDEX_NAME                    INDEX_TYPE                  TABLE_NAME
------------------------------ --------------------------- ------------------------------
ID_LOCAL                      NORMAL                      TEST


删除id_local索引
drop index id_local;

重新在ID列上创建一个GLOBAL的索引
create index id_global on test(id) global;
SQL> select INDEX_NAME,PARTITION_NAME,HIGH_VALUE,STATUS from dba_ind_partitions where index_name='ID_GLOBAL';

no rows selected

SQL> select INDEX_NAME,INDEX_TYPE,TABLE_NAME from dba_indexes where index_name='ID_GLOBAL';

INDEX_NAME                    INDEX_TYPE                  TABLE_NAME
------------------------------ --------------------------- ------------------------------
ID_GLOBAL                      NORMAL                      TEST
从上面可以看出,它此时是个普通索引。dba_ind_partitions里根本就没有记录。

SQL>create index i_id_global on test(data) global
  partition by range(id)
  ( partition p1 values less than (10000) ,
    partition p2 values less than (MAXVALUE) 
  );
  partition by range(id)
                        *
ERROR at line 2:
ORA-14038: GLOBAL partitioned index must be prefixed
此错误表示GLOBAL的索引必须是prefixed,即索引分区的列,必须是其基表的分区列。


SQL>create index id_global on test(id) global
  partition by range(id)
  ( partition p1 values less than (10000) ,
    partition p2 values less than (MAXVALUE) 
  );

Index created.


SQL> select INDEX_NAME,PARTITION_NAME,HIGH_VALUE,STATUS from dba_ind_partitions where index_name='ID_GLOBAL';

INDEX_NAME                    PARTITION_NAME                HIGH_VALUE          STATUS
------------------------------ ------------------------------ -------------------- --------
ID_GLOBAL                      P1                            10000                USABLE
ID_GLOBAL                      P2                            MAXVALUE            USABLE

SQL> select INDEX_NAME,INDEX_TYPE,TABLE_NAME from dba_indexes where index_name='ID_GLOBAL';

INDEX_NAME                    INDEX_TYPE                  TABLE_NAME
------------------------------ --------------------------- ------------------------------
ID_GLOBAL                      NORMAL                      TEST

从上面可以看出,它此时是个GLOBAL的索引了。dba_ind_partitions里有记录。请和上面的做个比较,加深印象。


 

 

分享到:
评论

相关推荐

    Oracle 分区表 分区索引

    ### Oracle 分区表与分区索引详解 #### 一、Oracle分区概述 在Oracle数据库中,分区技术是一种非常有效的管理大型表和索引的方法。通过将一个大的表或索引分成多个较小的部分(分区),可以显著提高查询性能,并...

    分区索引,本地索引,全局索引的区别

    #### 一、Oracle分区索引概念及分类 在Oracle数据库中,分区索引是针对分区表的一种特殊索引类型,它可以显著提高对于大规模数据集的查询性能。根据索引是否与表的分区策略相匹配,分区索引可以分为两大类:本地...

    ORACLE重建索引总结

    索引状态有`VALID`(有效)、`N/A`(分区索引有效)和`UNUSABLE`(失效)三种。 七、相关术语 1. 高基数:表示列的唯一值多。 2. 低基数:表示列的唯一值少。 3. 以删除的叶节点数量:记录因`DELETE`操作逻辑删除的...

    oracle10g创建分区表

    创建分区表后,通常会创建本地分区索引,这可以进一步提升查询性能。本地分区索引与分区表对应,每个分区都有自己的索引,这样索引查询可以直接定位到特定分区,减少全表扫描的可能性。在示例中,创建了一个名为 `...

    oracle约束和索引笔记

    - **分区索引(Partitioned Index)**: 将大型表的索引分割成更小、更易管理的部分,提高大规模数据的查询性能。 - **复合索引(Composite Index)**: 包含多个列的索引,按列的顺序排列,对于包含这些列的查询非常...

    深入学习分区表及分区索引(详解oracle分区.docx

    在分区表上创建索引时,可以创建分区索引或全局索引。分区索引与表分区相对应,而全局索引则跨越所有分区。非分区表可以拥有分区或非分区索引,但分区表必须至少有一个分区键,最多可包含16个列,这些列可以是可为空...

    oracle表分区总结

    除了范围和列表分区,Oracle还支持其他类型的分区,如哈希分区(Hash Partitioning)、复合分区(Composite Partitioning,结合范围和列表分区)和分区索引(Partitioned Indexes)。这些分区技术可以根据不同的业务...

    ORACLE表自动按月分区步骤

    通过上述步骤,我们可以看到分区表会自动为新数据所在月份创建一个新的分区`SYS_P183`,并且会自动生成相应的分区索引。 #### 八、总结 本文详细介绍了如何在Oracle数据库中实现表的自动按月分区及本地索引的创建...

    Oracle Partition分区详细总结.pdf

    在此示例中,`ORDER_DATE`作为分区键,可以根据不同的日期范围创建分区。 2. **列表分区**:根据一组离散的值将数据分布到不同的分区。例如,将客户数据按地区进行分区。 3. **散列分区**:根据哈希函数的结果将...

    分区索引研究.pdf

    通过对Oracle分区表及分区索引技术的深入了解,我们可以更加有效地管理和优化大型数据库系统的性能。合理的分区策略不仅可以提升查询效率,还能简化日常的数据库管理任务。希望本文能为读者提供有价值的指导和参考。

    关于oracle的表空间,分区表,以及索引的总结

    - **分区索引**:对于分区表,可以创建全局分区索引或局部分区索引。全局分区索引覆盖整个表,而局部分区索引仅覆盖其对应的分区,通常局部分区索引在查询只涉及特定分区时能提供更好的性能。 #### 总结 Oracle的...

    ORACLE分区表的创建

    本文将详细介绍在Oracle中如何创建分区表,包括各种分区类型及其应用场景,并通过具体示例进行说明。 #### 二、分区类型及定义 在Oracle中,主要有以下四种类型的分区方法: 1. **范围分区 (Range Partitioning)*...

    Oracle表分区详解

    2. **创建分区表**:在CREATE TABLE语句中指定分区选项。 3. **插入数据**:数据将自动根据分区规则分配到相应分区。 4. **查询优化**:编写查询时考虑分区,利用分区键进行筛选,以充分利用分区优势。 在实际应用...

    完整ORACLE创建表空间、用户、设置用户权限脚本

    ### 完整Oracle创建表空间、用户及设置用户权限脚本解析 #### 一、创建表空间 在Oracle数据库管理中,创建表空间是数据库管理的基础之一。表空间是Oracle数据库中逻辑存储结构的一部分,它将数据库物理存储空间...

    oracle 视图、索引(自用)

    1. 索引类型:B树索引(默认)、位图索引、函数索引、唯一索引、复合索引、分区索引等。 2. B树索引:最常见的索引类型,适用于经常进行等值查询的列,提供快速查找。 3. 位图索引:适合于低基数(非唯一值少)的列...

    oracel 分区表索引失效的问题

    1. **创建分区表:** 创建了一个基于日期范围的分区表`T_RANGE2`,其中包含三个字段:`id`(主键)、`test_date`(日期字段)、`test1`(字符串字段)。 ```sql CREATE TABLE T_RANGE2 ( id NUMBER NOT NULL, ...

    09 oracle的索引 PPT

    3. 分区索引:在大型表上使用,通过分区减少索引的扫描范围。 4. 快速全局索引扫描(Full-Index Scan):当索引条目少于表的行数时,全索引扫描可能比全表扫描更快。 六、索引的限制 1. 空值处理:Oracle中的空值在...

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

    总结起来,"Oracle partition_oracle_自动创建分区表脚本"是一个利用Oracle数据库的分区功能,通过PL/SQL包"PKG_ADD_PART_NEW4"提供的存储过程,实现自动化创建分区表的解决方案。这个工具可以帮助数据库管理员更...

    Oracle重构索引

    ### Oracle 重构索引知识点详解 #### 一、Oracle索引重构概述 在日常的数据库维护工作中,我们可能会遇到数据库中的索引变得杂乱无章的情况。这种情况可能会导致查询性能下降,因此对索引进行重构是非常必要的。...

Global site tag (gtag.js) - Google Analytics