分区索引学习笔记

续接上次的分区表学习笔记,对分区索引进行了总结。

--index maintance
SQL> select index_name,table_name from user_indexes where table_name='RANGE_PART';

no rows selected

--create one global index
SQL> create index glb_range_part on range_part(a,b)
  2  global partition by range(a)
  3  ( partition part_01 values less than(1000),
  4    partition part_02 values less than(maxvalue)
  5  );

Index created.
SQL> create index ind_range_part on range_part(a,b) local;
create index ind_range_part on range_part(a,b) local
                                          *
ERROR at line 1:
ORA-01408: such column list already indexed
--如果已经定义了index的列,则不能再创建其他的索引
--再次验证
SQL> create index ind_range_part on range_part(a,b);

Index created.

SQL> create index ind_range_part on range_part(a,b) local;
create index ind_range_part on range_part(a,b) local
             *
ERROR at line 1:
ORA-00955: name is already used by an existing object

--提示是index名字重复了,似乎可以重新建一个其他名字的index
SQL> create index ind1_range_part on range_part(a,b);
create index ind1_range_part on range_part(a,b)
                                           *
ERROR at line 1:
ORA-01408: such column list already indexed
--这次还是回到上一步,错误重现

--如果不加local,索引在status列会有不同
SQL> select index_name,table_name,status from user_indexes where table_name='RANGE_PART';

INDEX_NAME                     TABLE_NAME                     STATUS
------------------------------ ------------------------------ --------
IND_RANGE_PART                 RANGE_PART                     VALID

SQL> drop index ind_range_part;

Index dropped.

SQL> create index ind_range_part on range_part(a,b) local;

Index created.

SQL> select index_name,table_name,status from user_indexes where table_name='RANGE_PART';

INDEX_NAME                     TABLE_NAME                     STATUS
------------------------------ ------------------------------ --------
IND_RANGE_PART                 RANGE_PART                     N/A

关于global index还有一点是global partition Index必须是prefixed的
SQL> create index ind_range_part on range_part(b,a)
global partition by range(a)
( partition part_01 values less than(1000),
  partition part_02 values less than(maxvalue)
)
SQL> /
global partition by range(a)
                           *
ERROR at line 2:
ORA-14038: GLOBAL partitioned index must be prefixed

--清除所有的索引,重新测试

SQL> create index ind_range_part on range_part(a,b)
global partition by range(a)
( partition glb_part_01 values less than(1000),
  partition glb_part_02 values less than(maxvalue)
)
  2    3    4    5    6 
SQL> /

Index created.

 

SQL> create index ind_range_part2 on range_part(b,a) local;

Index created.

 1* select index_name,status from user_indexes where table_name='RANGE_PART'
SQL> /

INDEX_NAME                     STATUS
------------------------------ --------
IND_RANGE_PART                 N/A
IND_RANGE_PART2                N/A

SQL> select index_name,partition_name,high_value,status from user_ind_partitions where index_name in(select index_name from user_indexes where table_name='RANGE_PART');

INDEX_NAME                     PARTITION_NAME                 HIGH_VALUE           STATUS
------------------------------ ------------------------------ -------------------- --------
IND_RANGE_PART                 GLB_PART_01                    1000                 USABLE
IND_RANGE_PART2                PART_05                        MAXVALUE             USABLE
IND_RANGE_PART2                PART_02                        4000                 USABLE
IND_RANGE_PART2                PART_01                        2000                 USABLE
IND_RANGE_PART                 GLB_PART_02                    MAXVALUE             USABLE

SQL> alter table range_part merge partitions part_01,part_02;

Table altered.

SQL> select index_name,partition_name,high_value,status from user_ind_partitions where index_name in(select index_name from user_indexes where table_name='RANGE_PART');

INDEX_NAME                     PARTITION_NAME                 HIGH_VALUE           STATUS
------------------------------ ------------------------------ -------------------- --------
IND_RANGE_PART                 GLB_PART_01                    1000                 UNUSABLE
IND_RANGE_PART2                PART_05                        MAXVALUE             USABLE
IND_RANGE_PART                 GLB_PART_02                    MAXVALUE             UNUSABLE
IND_RANGE_PART2                SYS_P51                        4000                 UNUSABLE

--分区编译
SQL> alter index ind_range_part2 rebuild partition SYS_P51;

Index altered.
INDEX_NAME                     PARTITION_NAME                 HIGH_VALUE           STATUS
------------------------------ ------------------------------ -------------------- --------
IND_RANGE_PART                 GLB_PART_01                    1000                 UNUSABLE
IND_RANGE_PART2                PART_05                        MAXVALUE             USABLE
IND_RANGE_PART                 GLB_PART_02                    MAXVALUE             UNUSABLE
IND_RANGE_PART2                SYS_P51                        4000                 USABLE

--对全局索引全表rebuild失败
SQL> ALTER INDEX IND_RANGE_PART REBUILD;
ALTER INDEX IND_RANGE_PART REBUILD
            *
ERROR at line 1:
ORA-14086: a partitioned index may not be rebuilt as a whole
--只能根据分区来相应rebuild

SQL> ALTER INDEX IND_RANGE_PART REBUILD PARTITION GLB_PART_01;

Index altered.

SQL> ALTER INDEX IND_RANGE_PART REBUILD PARTITION GLB_PART_02;

Index altered.

SQL> ALTER TABLE RANGE_PART RENAME PARTITION SYS_P51 TO PART_01;

Table altered.

SQL> ALTER TABLE RANGE_PART SPLIT PARTITION PART_01 AT(2000) INTO (PARTITION PART_01,PARTITION PART_02);

Table altered.

SQL> select index_name,partition_name,high_value,status from user_ind_partitions where index_name in(select index_name from user_indexes where table_name='RANGE_PART');

INDEX_NAME                     PARTITION_NAME                 HIGH_VALUE           STATUS
------------------------------ ------------------------------ -------------------- --------
IND_RANGE_PART                 GLB_PART_01                    1000                 UNUSABLE
IND_RANGE_PART2                PART_05                        MAXVALUE             USABLE
IND_RANGE_PART2                PART_02                        4000                 UNUSABLE
IND_RANGE_PART2                SYS_P51                        2000                 UNUSABLE
IND_RANGE_PART                 GLB_PART_02                    MAXVALUE             UNUSABLE

--PARTITION_NAME为SYS_P51,这个是Index的partition_name
SQL> SELECT PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='RANGE_PART';

PARTITION_NAME
------------------------------
PART_01
PART_02
PART_05

--分区名字没有问题

--rebuild索引有以下的方式
SQL> ALTER TABLE RANGE_PART MODIFY PARTITION PART_01 REBUILD UNUSABLE LOCAL INDEXES;

Table altered.

SQL> ALTER INDEX IND_RANGE_PART2 REBUILD PARTITION PART_02;

Index altered.

最后有几个视图需要注意一下。

SQL> SELECT PARTITION_COUNT,STATUS,TABLE_NAME FROM USER_PART_TABLES WHERE TABLE_NAME='RANGE_PART';

PARTITION_COUNT STATUS   TABLE_NAME
--------------- -------- ------------------------------
              3 VALID    RANGE_PART

--查找partition key
SQL> SELECT NAME,OBJECT_TYPE,COLUMN_NAME FROM USER_PART_KEY_COLUMNS WHERE NAME='RANGE_PART';

NAME                           OBJEC COLUMN_NAME
------------------------------ ----- --------------------
RANGE_PART                     TABLE A

--USER_TAB_PARTITIONS
--USER_IND_PARTITIONS

时间: 2024-09-17 04:33:28

分区索引学习笔记的相关文章

oracle数据库对象-索引学习笔记

一.索引的概念   索引类似于查字典,通过拼音.笔画,只要几步就能查到所要的字.数据库里,通过索引,只要少量的读,就能找到所需的记录.   使用索引需要找到一个平衡点,索引太多会影响DML语句的速度,因为要写索引表.索引太少又不能提高查询速度.   二.B*树索引 1.B*树索引:我们所说的"传统"的索引.create index 创建的索引默认是B*索引.   B*数索引类似于一颗二叉树,但并不是二叉树.B*树中的"B"不代表二叉(binary),而代表平衡(ba

【三思笔记】 全面学习Oracle分区表及分区索引

[三思笔记]全面学习Oracle分区表及分区索引 2008-04-15 关于分区表和分区索引(About PartitionedTables and Indexes) 对于 10gR2 而言,基本上可以分成几类: v  Range(范围)分区 v  Hash(哈希)分区 v  List(列表)分区 v  以及组合分区:Range-Hash,Range-List. 对于表而言(常规意义上的堆组织表),上述分区形式都可以应用(甚至可以对某个分区指定 compress 属性),只不过分区依赖列不能是

Mysql学习笔记(八)索引

原文:Mysql学习笔记(八)索引 PS:把昨天的学习内容补上...发一下昨天学的东西....五月三日...继续学习数据库... 学习内容: 索引.... 索引的优点: 1.通过创建唯一索引,可以保证数据库每行数据的唯一性... 2.使查找的速度明显加快... 3.当使用分组和排序进行查询时,可以缩短时间... 索引的缺点: 1.维护索引需要耗费数据库的资源... 2.索引需要占用磁盘空间... 3.对表进行增删改的时候,由于索引的存在,时间会有所增加... 索引的分类... 普通索引和唯一索引

Mysql学习笔记(九)索引查询优化

原文:Mysql学习笔记(九)索引查询优化 PS:上网再次看了一下数据库关于索引的一些细节...感觉自己学的东西有点少...又再次的啃了啃索引.... 学习内容: 索引查询优化... 上一章说道的索引还不是特别的详细,再补充一些具体的细节... 1.B-Tree索引... B-tree结构被称为平衡多路查找树...其数据结构为:     这就是其数据结构图...我们没必要完全的理解其中的原理..并且我也不会做过多的原理介绍...我们只需要知道数据库是以这种方式进行存储数据的就可以了...   m

PL/SQL学习笔记(索引贴)

我前段时间写了T-SQL学习笔记得到了许多朋友的支持当然也有一些朋友提出了质疑,在此一并表示感谢最近项目中用到Oracle,于是萌生了写PL/SQL学习笔记的念头.同时也希望得到大家的支持或批评.并非常希望能和朋友们一起讨论相关知识. 这是一个有一点T-SQL基础的.刚入门者的学习笔记,以Oracle  10g为讲解对象没有涉及到高级话题如果对哪篇文章有疑问,可以在文章下留言我会尽快回复的 下面我为这个系列文章做一个索引 一: 常量变量及数据类型初步       1:常量变量       2:数

Ruby学习笔记_索引贴

学习Ruby也有段时间了,在学习的同时也做了些笔记并发到了园子睐.看到园子里的大虾们在出了一系列文章后都会做个索引贴,这样很方便,所以本人今天抽了个空就把它整理了下,方便自己的同时也方便感兴趣的朋友.   Ruby学习笔记目录: 1.Ruby入门 2.Ruby-循环与选择结构 3.Ruby-String 4.Ruby-Array 5.Ruby-Hash 6.Ruby-Block, Proc and Lambda 7.Ruby-正则表达式 8.Ruby-Symbol 9.Ruby-Method,C

作为一个新手的Oracle(DBA)学习笔记

Oracle数据库笔记 Jack Chaing 作者QQ595696297 交流群 127591054 祝大家学习进步. 如果大家想看Word版本的可以去下载:Word排版比较清晰一些. http://download.csdn.net/detail/jack__chiang/9810532 此笔记是作者本人去年开始从一个DBA新人的学习笔记,积累至今,希望拿出来给那些对DBA有兴趣的童孩学习,大家一起努力嘛. 此笔记记录了作者工作学习中从零基础的学习的记录,和从中遇见的问题与问题的解决!很高兴

VSTO学习笔记(二)Excel对象模型

原文:VSTO学习笔记(二)Excel对象模型 上一次主要学习了VSTO的发展历史及其历代版本的新特性,概述了VSTO对开发人员的帮助和效率提升.从这次开始,将从VSTO 4.0开始,逐一探讨VSTO开发中方方面面,本人接触VSTO时间不长,也是一次尝试.鉴于Excel在整个Office家族中的重要地位,故先从Excel开始介绍,后续内容会陆续介绍Word.PowerPoint.Outlook.InfoPath等.由于VSTO 4.0建立在Office 2010基础之上,先介绍一下Office

我的Android进阶之旅------>Android中编解码学习笔记

编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等.最近因为项目的关系,需要理清媒体的codec,比较搞的是,在豆丁网上看运营商的规范 标准,同一运营商同样的业务在不同文档中不同的要求,而且有些要求就我看来应当是历史的延续,也就是现在已经很少采用了.所以豆丁上看不出所以然,从 wiki上查.中文的wiki信息量有限,很短,而wiki的英文内容内多,