oracle分区索引的失效和重建代码示例

上一篇文章中我们了解了oracle普通表转化为分区表的方法的相关内容,接下来的这篇文章,我们将探讨oracle分区索引的失效和重建问题,提供了相关代码示例供大家参考,具体如下。

--创建测试表
SQL> create table t as select object_id,object_name from dba_objects;

表已创建。

SQL> select min(object_id),max(object_id) from t;
MIN(OBJECT_ID) MAX(OBJECT_ID)
-------------- --------------
       2     76083
SQL> create table t_part(object_id int,object_name varchar2(1000)) partition by range(object_id)
 2 (
 3 partition p1 values less than (10000),
 4 partition p2 values less than (20000),
 5 partition p3 values less than (30000),
 6 partition p4 values less than (40000),
 7 partition pm values less than (maxvalue));

表已创建。

SQL> insert into t_part select * from t;

已创建72663行。

SQL> commit;
--创建本地分区索引
SQL> create index idx_part_local on t_part(object_name) local;

索引已创建。
创建全局非分区索引

SQL> create index idx_part_global on t_part(object_id) global;

索引已创建。
删除其中一个分区

SQL> alter table t_part drop partition p1;

表已更改。
全局非分区索引失效,本地分区索引没有失效

SQL> select status,index_name from user_indexes s where index_name='IDX_PART_GLOBAL';
STATUS  INDEX_NAME
-------- ------------------------------
UNUSABLE IDX_PART_GLOBAL

SQL> select status,index_name from user_ind_partitions s where index_name='IDX_PART_LOCAL';

STATUS  INDEX_NAME
-------- ------------------------------
USABLE  IDX_PART_LOCAL
USABLE  IDX_PART_LOCAL
USABLE  IDX_PART_LOCAL
USABLE  IDX_PART_LOCAL
--重建失效索引
SQL> alter index idx_part_global rebuild;

索引已更改。

在删除表分区的时候,可以通过以下命令进行索引重建

alter table t_part drop partition p2 update indexes;
创建全局分区索引

SQL> drop index idx_part_global;

索引已删除。

SQL> CREATE INDEX idx_part_global_full ON t_part (object_id)
 2   GLOBAL PARTITION BY RANGE (object_id)
 3    (PARTITION p1 VALUES LESS THAN (10000),
 4     PARTITION p2 VALUES LESS THAN (30000),
 5     PARTITION p3 VALUES LESS THAN (MAXVALUE));

索引已创建。

--删除其中一个分区
SQL> alter table t_part drop partition p3;

表已更改。

--全局分区索引失效
SQL> select status,index_name from user_ind_partitions s where index_name='IDX_PART_GLOBAL_FULL';
STATUS  INDEX_NAME
-------- ------------------------------
UNUSABLE IDX_PART_GLOBAL_FULL
UNUSABLE IDX_PART_GLOBAL_FULL
UNUSABLE IDX_PART_GLOBAL_FULL
SQL> select /*+index(t IDX_PART_LOCAL)*/ * from t_part t where object_name = '/7f6c264c_IIOPAddress';
 OBJECT_ID OBJECT_NAME
---------- -----------------------------------
   35031 /7f6c264c_IIOPAddress
   35030 /7f6c264c_IIOPAddress
SQL> select /*+index(t IDX_PART_GLOBAL_FULL)*/ * from t_part t where object_id > 35000;select /*+index(t IDX_PART_GLOBAL_FULL)*/ * from t_part t where object_id > 35000*

第 1 行出现错误:

ORA-01502: 索引 'SCOTT.IDX_PART_GLOBAL_FULL' 或这类索引的分区处于不可用状态
当需要对分区表进行下面操作时,都会导致全局索引的失效。

ADD (HASH)
COALESCE (HASH)
DROP
EXCHANGE
MERGE
MOVE
SPLIT
TRUNCATE

之后需要对失效索引进行重建,也可以在删除分区表的时候指定 UPDATE INDEXES 直接进行索引的重建。

总结

以上就是本文关于oracle分区索引的失效和重建代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:oracle 数据库启动阶段分析、oracle 虚拟专用数据库详细介绍等,有什么问题可以直接留言,小编会及时回复大家的。感谢朋友们对本站的支持!

(0)

相关推荐

  • oracle 索引的相关介绍(创建、简介、技巧、怎样查看) .

    一.索引简介 1.索引相当于目录 2.索引是通过一组排序后的索引键来取代默认的全表扫描检索方式,从而提高检索效率. 3.索引的创建要适度,多了会影响增删改的效率,少了会影响查询的效率,索引最好创建在取值分散的列上,避免对同一张表创建过多的索引 4.索引的使用对用户来说是透明的,由系统来决定什么时候使用索引. 5.Oracle支持多种类型的索引,可以按列的多少.索引值是否唯一和索引数据的组织形式对索引进行分类,以满足各种表和查询条件的要求.(请见附件) a. 单列索引和复合索引 b.B树索引(cr

  • Oracle外键不加索引引起死锁示例

    --创建一个表,此表作为子表 create table fk_t as select *from user_objects; delete from fk_t where object_id is null; commit; --创建一个表,此表作为父表 create table pk_t as select *from user_objects; delete from pk_t where object_id is null; commit; --创建父表的主键 alter table PK

  • Oracle CBO优化模式中的5种索引访问方法浅析

    本文主要讨论以下几种索引访问方法: 1.索引唯一扫描(INDEX UNIQUE SCAN) 2.索引范围扫描(INDEX RANGE SCAN) 3.索引全扫描(INDEX FULL SCAN) 4.索引跳跃扫描(INDEX SKIP SCAN) 5.索引快速全扫描(INDEX FAST FULL SCAN) 索引唯一扫描(INDEX UNIQUE SCAN) 通过这种索引访问数据的特点是对于某个特定的值只返回一行数据,通常如果在查询谓语中使用UNIQE和PRIMARY KEY索引的列作为条件的

  • oracle分区索引的失效和重建代码示例

    上一篇文章中我们了解了oracle普通表转化为分区表的方法的相关内容,接下来的这篇文章,我们将探讨oracle分区索引的失效和重建问题,提供了相关代码示例供大家参考,具体如下. --创建测试表 SQL> create table t as select object_id,object_name from dba_objects; 表已创建. SQL> select min(object_id),max(object_id) from t; MIN(OBJECT_ID) MAX(OBJECT_

  • 深入oracle分区索引的详解

    表可以按range.hash.list分区,表分区后,其上的索引和普通表上的索引有所不同,oracle对于分区表上的索引分为2类,即局部索引和全局索引,下面分别对这2种索引的特点和局限性做个总结.局部索引local index1.局部索引一定是分区索引,分区键等同于表的分区键,分区数等同于表的分区数,一句话,局部索引的分区机制和表的分区机制一样.2.如果局部索引的索引列以分区键开头,则称为前缀局部索引.3.如果局部索引的列不是以分区键开头,或者不包含分区键列,则称为非前缀索引.4.局部索引只能依

  • ORACLE批量导入图片到BLOB字段代码示例

    要插入图片的表不是固定的,而且是批量插入很多张,还要考虑到因为图片的文件名错误,修改后要再次插入,此时应避免已经插入的重复执行操作, 浪费时间. 所以就选择先用一张临时表来暂时保存从文件系统读取的照片,用DBMS_LOB的方法来处理. 第一步:创建一个数据库可以访问的目录(注意:这个目录是数据库服务器上的目录,不是客户机上的) -- Create directory create or replace directory 图片目录 as 'E:\照片'; 第二步:将图片文件放入刚建好的目录下面,

  • Oracle 分区索引介绍和实例演示

    分区索引(或索引分区)主要是针对分区表而言的.随着数据量的不断增长,普通的堆表需要转换到分区表,其索引呢,则对应的转换到分区索引.分区索引的好处是显而易见的.就是简单地把一个索引分成多个片断,在获取所需数据时,只需要访问更小的索引片断(块)即可实现.同时把分区放在不同的表空间可以提高分区的可用性和可靠性.本文主要描述了分区索引的相关特性并给出演示示例. 1.分区索引的相关概念 a.分区索引的几种方式:表被分区而索引未被分区:表未被分区,而索引被分区:表和索引都被分区 b.分区索引可以分为本地分区

  • MySql索引提高查询速度常用方法代码示例

    使用索引提高查询速度 1.前言 在web开发中,业务模版,业务逻辑(包括缓存.连接池)和数据库这三个部分,数据库在其中负责执行SQL查询并返回查询结果,是影响网站速度最重要的性能瓶颈.本文主要针对Mysql数据库,在淘宝的去IOE(I 代表IBM的缩写,即去IBM的存储设备和小型机:O是代表Oracle的缩写,去Oracle数据库,采用Mysql和Hadoop代替:E是代表EMC2,去EMC2的设备性,用PC server代替EMC2),大量使用Mysql集群!而优化数据的重要一步就是索引的建立

  • oracle数据库索引失效

    今天一个同事突然问我索引为什么失效.说实在的,失效的原因有多种: 但是如果是同样的sql如果在之前能够使用到索引,那么现在使用不到索引,以下几种主要情况: 1. 随着表的增长,where条件出来的数据太多,大于15%,使得索引失效(会导致CBO计算走索引花费大于走全表) 2. 统计信息失效      需要重新搜集统计信息 3. 索引本身失效      需要重建索引 下面是一些不会使用到索引的原因 索引失效 1) 没有查询条件,或者查询条件没有建立索引 2) 在查询条件上没有使用引导列 3) 查询

  • Oracle函数使索引列失效的解决办法

    在索引列上使用函数使得索引失效的是常见的索引失效原因之一,因此尽可能的避免在索引列上使用函数.尽管可以使用基于函数的索引来解决索引失效的问题,但如此一来带来的比如磁盘空间的占用以及列上过多的索引导致DML性能的下降.本文描述的是一个索引列上使用函数使其失效的案例. 一.数据版本与原始语句及相关信息 1.版本信息 SQL> select * from v$version; BANNER --------------------------------------------------------

  • Oracle数据库索引的维护

    正在看的ORACLE教程是:Oracle数据库索引的维护. 本文只讨论Oracle中最常见的索引,即是B-tree索引.本文中涉及的数据库版本是Oracle8i. 一. 查看系统表中的用户索引 在Oracle中,SYSTEM表是安装数据库时自动建立的,它包含数据库的全部数据字典,存储过程.包.函数和触发器的定义以及系统回滚段. 一般来说,应该尽量避免在SYSTEM表中存储非SYSTEM用户的对象.因为这样会带来数据库维护和管理的很多问题.一旦SYSTEM表损坏了,只能重新生成数据库.我们可以用下

  • 解析一个通过添加本地分区索引提高SQL性能的案例

    该sql如下: 复制代码 代码如下: Select  /*+ parallel(src, 8) */ distinct  src.systemname as systemname  ,  src.databasename as databasename  ,  src.tablename as tablename  ,  src.username as usernamefrom  <STRONG>meta_dbql_table_usage_exp_hst</STRONG> src 

  • Oracle复合索引与空值的索引使用问题小结

    昨天在QQ群里讨论一个SQL优化的问题,语句大致如下: select A,min(B) from table group by A;--A,B都没有not null约束,A列无空值,B列有空值.--存在复合索引IX_TEST(A,B) 于是手动测试,环境采用Oracle自带的scott用户下的emp表. 1.首先查看如下语句的执行计划(此时表只有主键索引): 2.添加IX_TEST(deptno,comm)后查看执行计划: 发现依然是全表扫描. 3.为deptno列添加非空约束后再次查看执行计划

随机推荐