Oracle技术和分区表相关的一点总结(五)

By | 07月11日
Advertisement

ddl对local partition index的影响,oracle会自动维护ddl对local partition index的影响:

SQL> select name,del_lf_rows,del_lf_rows_len from index_stats;

NAME DEL_LF_ROWS DEL_LF_ROWS_LEN

------------------------------ ----------- ---------------

IDX_T 0 0

SQL> alter table t truncate partition p4;

表被截断。

SQL> analyze index idx_t validate structure;

索引已分析

SQL> select name,del_lf_rows,del_lf_rows_len from index_stats;

NAME DEL_LF_ROWS DEL_LF_ROWS_LEN

------------------------------ ----------- ---------------

IDX_T 0 0

--看来通过analyze index idx_t validate structure;没法验证ddl对local partition index的维护,因为

在truncate partition前后index_stats里的数据没有变化

SQL> select index_name,partition_name from dba_ind_partitions where index_name i

n ('IDX_T','IDX_T1','IDX_T_NAME');

INDEX_NAME PARTITION_NAME

------------------------------ ------------------------------

IDX_T P5

IDX_T P4

IDX_T P3

IDX_T P2

IDX_T P1

SQL> alter table t drop partition p4;

表已更改。

SQL> select index_name,partition_name from dba_ind_partitions where index_name i

n ('IDX_T','IDX_T1','IDX_T_NAME');

INDEX_NAME PARTITION_NAME

------------------------------ ------------------------------

IDX_T P5

IDX_T P3

IDX_T P2

IDX_T P1

--drop partition之后和该分区相关的local partition index也被drop了...

SQL> select object_name,subobject_name,last_ddl_time from dba_objects where obje

ct_name='IDX_T';

OBJECT_NAM SUBOBJECT_NAME LAST_DDL_TIME

---------- ------------------------------ -------------------

IDX_T P1 2010/11/02 12:55:38

IDX_T P2 2010/11/02 12:55:38

IDX_T P3 2010/11/02 12:55:38

IDX_T P5 2010/11/02 12:55:38

IDX_T 2010/11/02 13:42:46

SQL> alter table t truncate partition p3;

表被截断。

SQL> select object_name,subobject_name,last_ddl_time from dba_objects where obje

ct_name='IDX_T';

OBJECT_NAM SUBOBJECT_NAME LAST_DDL_TIME

---------- ------------------------------ -------------------

IDX_T P1 2010/11/02 12:55:38

IDX_T P2 2010/11/02 12:55:38

IDX_T P3 2010/11/02 13:50:29

IDX_T P5 2010/11/02 12:55:38

IDX_T 2010/11/02 13:50:29

--通过ddl里的时间我们可以清楚的发现在truncate partition时oracle维护了

其对应的local index,因为p3对应的ddl时间由原来的12:55:38变成了13:50:29

SQL> select segment_name,partition_name,bytes/1024/1024 m from dba_segments whe

re segment_name='IDX_T';

SEGMENT_NAME PARTITION_NAME M

-------------------- ------------------------------ ----------

IDX_T P1 5

IDX_T P2 5

IDX_T P3 .0625

IDX_T P5 6

SQL> alter table t truncate partition p2;

表被截断。

SQL> select segment_name,partition_name,bytes/1024/1024 m from dba_segments whe

re segment_name='IDX_T';

SEGMENT_NAME PARTITION_NAME M

-------------------- ------------------------------ ----------

IDX_T P1 5

IDX_T P2 .0625

IDX_T P3 .0625

IDX_T P5 6

SQL>

--当然通过local index的大小我们也可以清楚的观查到,local partition index

p2的大小在truncate p2之前是5m,之后变成了0.625m,可见oracle维护了local index

--======================

dml对global partition index的影响:

SQL> select name,del_lf_rows,del_lf_rows_len from index_stats;

NAME DEL_LF_ROWS DEL_LF_ROWS_LEN

------------------------------ ----------- ---------------

IDX_T 0 0

SQL> delete from t where object_id=100;

已删除128行。

SQL> commit;

提交完成。

SQL> analyze index idx_t_g validate structure;

索引已分析

SQL> select name,del_lf_rows,del_lf_rows_len from index_stats;

NAME DEL_LF_ROWS DEL_LF_ROWS_LEN

------------------------------ ----------- ---------------

IDX_T_G 127 2565

SQL>

--很显然oracle会自动维护dml对global partition index的维护,这个其实

不用验证也没有问题,如果不能自动维护dml,那么怎么使用这种类型的index

--=========================

dll对global partition index的影响:

SQL> select object_name,subobject_name,last_ddl_time from dba_objects where obje

ct_name='IDX_T_G';

OBJECT_NAM SUBOBJECT_NAME LAST_DDL_TIME

---------- ------------------------------ -------------------

IDX_T_G GP1 2010/11/02 14:17:49

IDX_T_G GP2 2010/11/02 14:17:49

IDX_T_G GP3 2010/11/02 14:17:49

IDX_T_G GP4 2010/11/02 14:17:49

IDX_T_G GP5 2010/11/02 14:17:49

IDX_T_G GP6 2010/11/02 14:17:49

IDX_T_G GP_MAX 2010/11/02 14:17:49

IDX_T_G 2010/11/02 14:17:49

已选择8行。

SQL> select segment_name,partition_name,bytes/1024/1024 m from dba_segments whe

re segment_name='IDX_T_G';

SEGMENT_NAME PARTITION_NAME M

-------------------- ------------------------------ ----------

IDX_T_G GP1 .0625

IDX_T_G GP2 .0625

IDX_T_G GP3 .0625

IDX_T_G GP4 .0625

IDX_T_G GP5 .0625

IDX_T_G GP6 .0625

IDX_T_G GP_MAX 12

已选择7行。

SQL> alter table t truncate partition p5;

表被截断。

SQL> select object_name,subobject_name,last_ddl_time from dba_objects where obje

ct_name='IDX_T_G';

OBJECT_NAM SUBOBJECT_NAME LAST_DDL_TIME

---------- ------------------------------ -------------------

IDX_T_G GP1 2010/11/02 14:17:49

IDX_T_G GP2 2010/11/02 14:17:49

IDX_T_G GP3 2010/11/02 14:17:49

IDX_T_G GP4 2010/11/02 14:17:49

IDX_T_G GP5 2010/11/02 14:17:49

IDX_T_G GP6 2010/11/02 14:17:49

IDX_T_G GP_MAX 2010/11/02 14:17:49

IDX_T_G 2010/11/02 14:17:49

已选择8行。

SQL> select segment_name,partition_name,bytes/1024/1024 m from dba_segments whe

re segment_name='IDX_T_G';

SEGMENT_NAME PARTITION_NAME M

-------------------- ------------------------------ ----------

IDX_T_G GP1 .0625

IDX_T_G GP2 .0625

IDX_T_G GP3 .0625

IDX_T_G GP4 .0625

IDX_T_G GP5 .0625

IDX_T_G GP6 .0625

IDX_T_G GP_MAX 12

已选择7行。

SQL>

--global index partition GP_MAX记录的数据>9000,而表分区p5的数据>8000,

在truncate p5之后对比GP_MAX前后的ddl修改时间和段大小,发现都没有任何变化,

我就认为ddl对global index partition不自动维护吧,实在没有太好的验证办法,当然

可以dump index的结构来看,感兴趣的自己测试一下吧。

其实从下面查询index的状态就可以看出来,此时的index状态全部变成了UNUSABLE:

SQL> select index_name,partition_name,status from dba_ind_partitions where index

_name in ('IDX_T_G');

INDEX_NAME PARTITION_NAME STATUS

------------------------------ ------------------------------ --------

IDX_T_G GP1 UNUSABLE

IDX_T_G GP2 UNUSABLE

IDX_T_G GP3 UNUSABLE

IDX_T_G GP4 UNUSABLE

IDX_T_G GP5 UNUSABLE

IDX_T_G GP6 UNUSABLE

IDX_T_G GP_MAX UNUSABLE

已选择7行。

SQL>

尝试重建这个global partition index :

SQL> alter index idx_t_g rebuild;

alter index idx_t_g rebuild

*

第 1 行出现错误:

ORA-14086: 不能将分区索引作为整体重建

SQL>

--看来只能一个一个重建了:

SQL> alter index idx_t_g rebuild partition gp1 ;

索引已更改。

SQL> alter index idx_t_g rebuild partition gp2 ;

索引已更改。

SQL> alter index idx_t_g rebuild partition gp3 ;

索引已更改。

SQL> alter index idx_t_g rebuild partition gp4 ;

索引已更改。

SQL> alter index idx_t_g rebuild partition gp5 ;

索引已更改。

SQL> alter index idx_t_g rebuild partition gp6 ;

索引已更改。

SQL> alter index idx_t_g rebuild partition gp_max ;

索引已更改。

SQL> select index_name,partition_name,status from dba_ind_partitions where index

_name in ('IDX_T_G');

INDEX_NAME PARTITION_NAME STATUS

------------------------------ ------------------------------ --------

IDX_T_G GP1 USABLE

IDX_T_G GP2 USABLE

IDX_T_G GP3 USABLE

IDX_T_G GP4 USABLE

IDX_T_G GP5 USABLE

IDX_T_G GP6 USABLE

IDX_T_G GP_MAX USABLE

已选择7行。

SQL>

--重建之后状态变成了USABLE,注意只要我们truncate一个分区,那么global

partition index的分区index的状态全部变成UNUSABLE

如何自动维护global partition index:

SQL> select index_name,partition_name,status from dba_ind_partitions where index

_name in ('IDX_T_G');

INDEX_NAME PARTITION_NAME STATUS

------------------------------ ------------------------------ --------

IDX_T_G GP1 USABLE

IDX_T_G GP2 USABLE

IDX_T_G GP3 USABLE

IDX_T_G GP4 USABLE

IDX_T_G GP5 USABLE

IDX_T_G GP6 USABLE

IDX_T_G GP_MAX USABLE

已选择7行。

SQL> alter table t truncate partition p1 update global indexes;

表被截断。

SQL> select index_name,partition_name,status from dba_ind_partitions where index

_name in ('IDX_T_G');

INDEX_NAME PARTITION_NAME STATUS

------------------------------ ------------------------------ --------

IDX_T_G GP1 USABLE

IDX_T_G GP2 USABLE

IDX_T_G GP3 USABLE

IDX_T_G GP4 USABLE

IDX_T_G GP5 USABLE

IDX_T_G GP6 USABLE

IDX_T_G GP_MAX USABLE

已选择7行。

SQL>

显然在ddl语句truncate后面加上update global indexes全局分区index的状态都变成了USABLE

,很显然oracle自动为了index,不过如果分区表和分区index比较大的话,那么update global indexes

的处理时间可能会很长,通过锁定表的时间也会很长,所以使用update global indexes子句要慎重。

如果全局分区index的状态原来就是UNUSABLE,那么即使加上update global indexes子句,oracle也不会

自动维护index:

SQL> select index_name,partition_name,status from dba_ind_partitions where index

_name in ('IDX_T_G');

INDEX_NAME PARTITION_NAME STATUS

------------------------------ ------------------------------ --------

IDX_T_G GP1 UNUSABLE

IDX_T_G GP2 UNUSABLE

IDX_T_G GP3 UNUSABLE

IDX_T_G

oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html

Similar Posts:

  • Oracle技术之和分区表相关的一点总结(四)

    3.访问全部数据,我们发现访问heap表要比访问分区表是少了一些逻辑读: 88429<88573,其实这点差别对性能来说是无关紧要的,重要的是说明了一个问题, 那就是尽量让执行的sql少读.少些,这也是sql调整的最终目的,相差的这100 多逻辑读主要发生在查找metadata上... SQL> select * from t1 ; 已选择1260672行. 已用时间: 00: 00: 26.70 执行计划 -------------------------------------------

  • 甲骨文全球大会2013上海-异彩纷呈的Oracle技术盛宴

    链接:http://www.eygle.com/archives/2013/07/2013_oow_shanghai_memory.html 为时四天(2013-07-22~2013-07-25)的上海Oracle Open World大会(暨甲骨文全球大会)落下帷幕,我整理行囊匆匆回到北京,开始新的工作历程,现在可以静下心来回忆一下这次参会的感受. 自2004年以来,中国举办的每一届OOW的我都参加了,两次上海.两次北京,期间还参加过两次在美国旧金山举行的OOW大会,可以说我是一个OOW的老会

  • Oracle数据库中分区表的操作方法

    Oracle数据库中分区表的操作方法 摘要:在大量业务数据处理的项目中,可以考虑使用分区表来提高应用系统的性能并方便数据管理,本文详细介绍了分区表的使用. 在大型的企业应用或企业级的数据库应用中,要处理的数据量通常可以达到几十到几百GB,有的甚至可以到TB级.虽然存储介质和数据处理技术的发展也很快,但是仍然不能满足用户的需求,为了使用户的大量的数据在读写操作和查询中速度更快,Oracle提供了对表和索引进行分区的技术,以改善大型应用系统的性能. 使用分区的优点: ·增强可用性:如果表的某个分区出

  • oracle中的分区表基本介绍

    Oracle Partition 分区详细总结 分类: oracle基础知识 2012-02-01 23:56 3041人阅读 评论(0) 收藏 举报 oracletabledateless数据库null Oracle Partition 分区详细总结 author:润明 2012-2-1 QQ:226399587 http://blog.csdn.net/runming918 此文从以下几个方面来整理关于分区表的概念及操作: 1.表空间及分区表的概念 2.表分区的具体作用 3.表分区的优缺点

  • 最老的新技术:调试Oracle技术实战

    最老的新技术:调试Oracle技术实战 什么是调试Oracle技术?调试Oracle就是对Oracle进行逆向工程,再通俗点说,就是反汇编Oracle.相信大家都认为这很疯狂.但其实不是这样的,Oracle的逆向工程没有你想象中的那么难.它是真正的纸老虎.我们的目的并不是读懂Oracle每一条反汇编代码,代码量太大.我们只需要从反编代码找出我们感兴趣的片... 详细解读 和小伙伴们一起来吐槽

  • oracle&amp;linux环境vm相关的调整

    oracle&linux环境vm相关的调整 由于linux内存管理倾向先将内存分配到cache里,经常导致系统内存free值很低,这个时候如果系统发生频繁的内存申请,例如数据库login或者需要申请比较多的内存时,可能会导致系统严重swap,影响系统的稳定性.对于不使用文件系统cache来操作数据库文件的环境,文件系统cache其实并不起太大作用,linux下没有像aix下直接控制文件系统内存使用比例的参数,只能通过配置基于内容大小和内存驻留时间的两种刷新两种策略来管理脏数据的写回. 为了系统能

  • 上海新炬:迎国庆·免费学Oracle技术

    新炬网络定期推出"名师大讲堂"专业IT技术知识分享,内容涉及Oracle数据库.性能测试.软件自动化测试等,与工作在技术前线的小伙伴们一起探讨实践中出现的技术难题,提供有效解决方案,大家通过交流共同成长! 迎国庆?免费学Oracle技术 一.项目简介 新炬学院集Oracle认证.技术培训.实习.实训和就业一条龙服务,为电信.金融.政府.IT等行业的企事业单位培养实用型DBA专业人才.目前开设有<DBA入门班>.<OCP/OCM认证班>.<企业项目实战班&g

  • Oracle技术_基础技术(0001)_字符串处理(截取文件名或扩展名)

    Oracle技术_基础技术(0001)_字符串处理(截取文件名或扩展名) Oracle技术_基础技术(0002)_5分钟会用存储过程_存储过程简单实例(包含循环.条件.增改查.参数传入.变量赋值.java调用等) Oracle技术_基础技术(0003)_UTL_FILE包用法详解_写出文件.读入库表 Oracle技术_基础技术(0004)_blob转换文件(图片.PDF.文本等与blob相互转换) 基础技术: 截取文件名: SELECT SUBSTR('pop.kid.orc.txt', 1,

  • Oracle技术之查看并行相关信息

    下面我通过实验介绍三种查看并行相关内容,比如并行度.并行执行的实例等. 1.V$PQ_TQSTAT视图 – 脚本 [[email protected] ~]$ cat showdop.sql column SERVER_TYPE format a15 column PROCESS format a10 select dfo_number, tq_id, server_type, process, num_rows, bytes, instance from v$pq_tqstat order by dfo_

  • Oracle技术之和外键相关的阻塞和死锁问题总结(三)

    session 2: SQL> delete from p where id=3; 阻塞... session 3: SQL> select sid,type,id1,id2,lmode,request,ctime,block from v$lock where sid in 2 (159,128) order by sid; SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK ---------- -- ---------- ---------- -------

Tags: