目的,有一个清理数据的需求,需要删除历史的一个分区所有记录信息,但是存在主键global索引,如何更好的维护。

如下测试流程一 提前创建好一个已时间created 字段作为分区键的范围分区表

SQL> select TABLE_OWNER,TABLE_NAME,PARTITION_NAME,HIGH_VALUE,TABLESPACE_NAME from dba_tab_partitions where TABLE_OWNER='TEST' and TABLE_NAME='A';TABLE_OWNER TABLE_NAME PARTITION_NAME HIGH_VALU
--------------------------------------------------------------------------------
TEST A PART_T01
TO_DATE(' 2013-08-24 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
TEST A SYS_P61
TO_DATE(' 2013-08-25 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
TEST A SYS_P62
TO_DATE(' 2019-05-12 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA
如下分区,是需要删除的,查询数据量
SQL> select count(*) from a partition(PART_T01);
COUNT(*)
----------
73384
测试表存在主键约束
SQL> select OWNER,CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,STATUS from dba_constraints where owner='TEST' and TABLE_NAME='A';
OWNER CONSTRAINT_NAME C TABLE_NAME STATUS
------------------------------ - ------------------------------ --------
TEST PK_A_CC P A ENABLED SQL> select INDEX_NAME,TABLE_OWNER,TABLE_NAME,COLUMN_NAME from dba_ind_columns where table_owner='TEST' and table_name='A';
INDEX_NAME TABLE_OWNER TABLE_NAME COLUMN_NAME
--------------------------------------------------------------------------------
PK_A_CC TEST A OBJECT_ID SQL> select INDEX_NAME,TABLE_OWNER,TABLE_NAME,status from dba_indexes where table_owner='TEST' and table_name='A';
INDEX_NAME TABLE_OWNER TABLE_NAME STATUS
------------------------------ -------------------------------- -------------------------------- --------
PK_A_CC TEST A VALID
--如下,直接删除指定分区 alter table a truncate partition PART_T01; --主键global 全局索引失效
SQL> select INDEX_NAME,TABLE_OWNER,TABLE_NAME,status from dba_indexes where table_owner='TEST' and table_name='A';
INDEX_NAME TABLE_OWNER TABLE_NAME STATUS
-------------------------------------------------------------------------------------------
PK_A_CC TEST A UNUSABLE
查询数据
SQL> select count(*) from a partition(PART_T01);
COUNT(*)
---------- SQL> select count(*) from a partition(SYS_P62);
COUNT(*)
---------- --恢复测试数据,再次测试,上述直接操作导致索引失效,不可取 insert into a select * from b where CREATED<TO_DATE('2013-08-24 00:00:00', 'YYYY-MM-DD HH24:MI:SS') and object_id>
*
ERROR at line :
ORA-: index 'TEST.PK_A_CC' or partition of such index is in unusable state SQL> alter index PK_A_CC rebuild; SQL> select INDEX_NAME,TABLE_OWNER,TABLE_NAME,status from dba_indexes where table_owner='TEST' and table_name='A';
INDEX_NAME TABLE_OWNER TABLE_NAME STATUS
-------------------------------------------------------------------------------------------
PK_A_CC TEST A VALID insert into a select * from b where CREATED<TO_DATE('2013-08-24 00:00:00', 'YYYY-MM-DD HH24:MI:SS') and object_id> commit; ************直接删除分区,可以删除数据,但是global索引会失效,实际工作不可取,另一种方式update global indexes,
alter table a truncate partition PART_T01 update global indexes;
但是这种模式,会申请什么样的锁资源,是否影响应用?******************************************************
测试,update global indexes 资源申请锁资源!!!

思路:1.查询再删除分区的一条记录
2.进行删除操作;
3.观察申请的对象tm锁资源
4.上述操作回退,删除其它分区的一条记录;
5.再次进行删除操作;
6.总结
1.查询再删除分区的一条记录
select min(object_id) from a where CREATED<TO_DATE('2013-08-24 00:00:00', 'YYYY-MM-DD HH24:MI:SS') ;  
 2.进行删除操作;
 session  delete a where object_id=; SQL> select sid from v$mystat where rownum=; SID ---------- 
session
SQL> select sid from v$mystat where rownum=;
SID
---------- alter table a truncate partition PART_T01 update global indexes;
ORA-: resource busy and acquire with NOWAIT specified or timeout expired
SQL> alter session set ddl_lock_timeout=;
alter table a truncate partition PART_T01 update global indexes;
  3.观察申请的对象tm锁资源
 SQL> select type,sid,id1,id2,lmode,request,ctime from v$Lock where sid in(,); 
TY SID ID1 ID2 LMODE REQUEST CTIME
-- ---------- ---------- ---------- ---------- ---------- ----------
AE
AE
TM
TM
TM
TM
TX
rows selected.
SQL> select owner,object_id,object_type from dba_objects where object_id in(,);
OWNER OBJECT_ID OBJECT_TYPE
------------------------------ ---------- -------------------
TEST TABLE PARTITION
TEST TABLE
dml 操作 申请 表对象TM3,表所在的分区TM3
truncate 表global 维护索引操作,申请 表对象TM3号锁,分区对象TM6号锁
   4.上述操作回退,删除其它分区的一条记录;
 SQL> roll; 对其它分区的数据修改,观察此truncate 及全局维护索引是否有效 

select min(object_id) from a where CREATED>TO_DATE('2013-08-24 00:00:00', 'YYYY-MM-DD HH24:MI:SS') ; 

delete a where object_id=; 
    5.再次进行删除操作
 alter table a truncate partition PART_T01 update global indexes; Table truncated.
      6.总结  
删除分区操作,使用如下方式,可以自动维护索引,保障索引是有效的;
会申请删除分区的tm6,也就是说删除的分区字段将无法被dml操作数据;其它分区不受影响
alter table a truncate partition PART_T01 update global indexes;
-------------------------

truncate删除一个分区,测试全局索引是否失效的更多相关文章

  1. Oracle 12C 新特性之表分区带 异步全局索引异步维护(一次add、truncate、drop、spilt、merge多个分区)

    实验准备:-- 创建实验表CREATE TABLE p_andy(ID number(10), NAME varchar2(40))PARTITION BY RANGE (id)(PARTITION ...

  2. [z]分区truncate操作的介绍及对全局索引和空间释放影响的案例解析

    [z]https://www.2cto.com/database/201301/181226.html 环境: [sql] [oracle@localhost ~]$ uname -r 2.6.18- ...

  3. Oracle12c中性能优化&amp;功能增强新特性之全局索引DROP和TRUNCATE 分区的异步维护

    Oracle 12c中,通过延迟相关索引的维护可以优化某些DROP和TRUNCATE分区命令的性能,同时,保持全局索引为有效. 1.   设置 下面的例子演示带全局索引的表创建和加载数据的过程. -- ...

  4. KingbaseES 全局索引是否因为DDL操作而变为Unusable ?

    前言 Oracle 在对分区做DDL操作时,会使分区全局索引失效,需要加上关键字update global indexes.KingbaseES 同样支持全局索引.那么,如果对分区表进行DDL操作,那 ...

  5. Atitit.分区对索引的影响 分区索引和全局索引 attilax总结

    Atitit.分区对索引的影响 分区索引和全局索引 attilax总结 1. 分区的好处1 2. 分区键:2 3. 分区的建议:2 4. 分区索引和全局索引:2 5. 全局索引就是在全表上创建索引, ...

  6. Oracle Spatial分区应用研究之七:同等分区粒度下全局索引优于分区索引的原因分析

    1.实验结论 同等分区粒度下,使用分区空间索引进行空间查询,比使用全局空间索引进行查询,对数据字典表的访问次数更多.假设分区数为X,则大概多3X次访问.具体说明见6实验结论. 2.实验目的 在之前的测 ...

  7. kafka2.x常用命令笔记(一)创建topic,查看topic列表、分区、副本详情,删除topic,测试topic发送与消费

    接触kafka开发已经两年多,也看过关于kafka的一些书,但一直没有怎么对它做总结,借着最近正好在看<Apache Kafka实战>一书,同时自己又搭建了三台kafka服务器,正好可以做 ...

  8. SQL Server 2005中的分区表(四):删除(合并)一个分区(转)

    在前面我们介绍过如何创建和使用一个分区表,并举了一个例子,将不 同年份的数据放在不同的物理分区表里.具体的分区方式为: 第1个小表:2010-1-1以前的数据(不包含2010-1-1). 第2个小表: ...

  9. SQL Server 2005中的分区表(四):删除(合并)一个分区

    在前面我们介绍过如何创建和使用一个分区表,并举了一个例子,将不 同年份的数据放在不同的物理分区表里.具体的分区方式为: 第1个小表:2010-1-1以前的数据(不包含2010-1-1). 第2个小表: ...

随机推荐

  1. 文献阅读 | Molecular Architecture of the Mouse Nervous System

    文章亮点: 按level来管理和分析数据,文章有不同stage,每个stage有不同subtype,这应该是一个真tree,而不只是一个进化树,文章里出现最多的进化树把所有的stage都整合了. 空间 ...

  2. Eclipse 搭建Struts2

    Eclipse版本 Mars Release (4.5.0) Struts版本 struts-2.5.20 下载地址:https://struts.apache.org/download.cgi#st ...

  3. 微信小程序之自定义底部弹出框动画

    最近做小程序时,会经常用到各种弹框.直接做显示和隐藏虽然也能达到效果,但是体验性太差,也比较简单粗暴.想要美美地玩,添加点动画还是非常有必要的.下面做一个底部上滑的弹框. wxml <view ...

  4. Socket: Java Socket 几个重要的TCP/IP选项解析(转)

    Socket选择可以指定Socket类发送和接受数据的方式.在JDK1.4中共有8个Socket选择可以设置.这8个选项都定义在java.net.SocketOptions接口中.定义如下: publ ...

  5. flutter 打开应用的闪屏动画

    import 'package:flutter/material.dart'; import 'package:flutter_app/pages/SplashScreen.dart'; void m ...

  6. JDK动态代理在RPC框架中的应用

    RPC框架中一般都有3个角色:服务提供者.服务消费者和注册中心.服务提供者将服务注册到注册中心,服务消费者从注册中心拉取服务的地址,并根据服务地址向服务提供者发起RPC调用.动态代理在这个RPC调用的 ...

  7. Nginx之https配置 - 运维笔记 (http->https强转)

    一.Nginx安装(略)安装的时候需要注意加上 --with-http_ssl_module,因为http_ssl_module不属于Nginx的基本模块.Nginx安装方法: # ./configu ...

  8. jmeter中特殊的时间处理方式

    需求: 1.获取当前时间的年月日时分秒毫秒 2.生成上一个月的随机某天的一个时间 3.生成一个年月日时分秒毫秒的一个时间戳 1.__time : 获取时间戳.格式化时间 ${__time(yyyy-M ...

  9. 数据分析入门——numpy

    一.什么是numpy Numpy提供了一个在Python中做科学计算的基础库,重在数值计算,主要用于处理多维数组(矩阵)的库.用来存储和处理大型矩阵,比Python自身的嵌套列表结构要高效的多.本身是 ...

  10. 【CSS3练习】在圆上旋转的菜单

    先上效果图:就是用js计算每个小圆的位置分布到大圆的边线上,然后在让大圆旋转起来. 线上查看地址:http://dtdxrk.github.io/game/css3-demo/diffuse.html ...