truncate删除一个分区,测试全局索引是否失效

目的,有一个清理数据的需求,需要删除历史的一个分区所有记录信息,但是存在主键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(*)
----------
         0
SQL> select count(*) from a partition(SYS_P62);
  COUNT(*)
----------
         5
--恢复测试数据,再次测试,上述直接操作导致索引失效,不可取

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>24056
*
ERROR at line 1:
ORA-01502: 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>24056

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‘) ; 24057 
 2.进行删除操作;
 session 1 delete a where object_id=24057; SQL> select sid from v$mystat where rownum=1; SID ---------- 312
session 2
SQL> select sid from v$mystat where rownum=1;
      SID
----------
       332
alter table a truncate partition PART_T01 update global indexes;
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
SQL> alter session set ddl_lock_timeout=600;
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(312,332); TY SID ID1 ID2 LMODE REQUEST CTIME -- ---------- ---------- ---------- ---------- ---------- ---------- AE 332 100 0 4 0 142 AE 312 100 0 4 0 1283 TM 332 89807 0 3 0 19 TM 332 89808 0 0 6 19 TM 312 89807 0 3 0 151 TM 312 89808 0 3 0 151 TX 312 262156 8718 6 0 151 7 rows selected. SQL> select owner,object_id,object_type from dba_objects where object_id in(89807,89808); OWNER OBJECT_ID OBJECT_TYPE ------------------------------ ---------- ------------------- TEST 89808 TABLE PARTITION TEST 89807 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‘) ; 

2 delete a where object_id=2; 
    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;
-------------------------

原文地址:https://www.cnblogs.com/lvcha001/p/11930072.html

时间: 2024-10-08 19:26:52

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

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

实验准备:-- 创建实验表CREATE TABLE p_andy(ID number(10), NAME varchar2(40))PARTITION BY RANGE (id)(PARTITION p1 VALUES LESS THAN (10),PARTITION p2 VALUES LESS THAN (20));Table created.-- 查看现在表的分区:SQL> col table_name for a25col partition_name for a25select tab

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

Oracle 12c中,通过延迟相关索引的维护可以优化某些DROP和TRUNCATE分区命令的性能,同时,保持全局索引为有效. 1.   设置 下面的例子演示带全局索引的表创建和加载数据的过程. -- 建表 CREATE TABLE t1 (id            NUMBER, comment   VARCHAR2(50), crt_time  DATE) PARTITION BY RANGE (crt_time) (PARTITION part_14 VALUES LESS THAN (

利用全局索引定位难缠的页面元素

前言 超级链接是网站中使用非常频繁的HTML元素,可以说超级链接是浏览者和服务器的交互的主要手段. 我们知道有点击链接时,大部分情况下都需要使用txt属性,因为链接没有其他属性可以用来匹配,但不是所有的超链接都支持txt属性特征串的,如果不支持,我们就只能通过索引+标签来定位唯一元素特征字符串了. 前言 咱们来举个栗子,比如我们想点击淘宝淘金币网址上的登陆查看金币明细这个页面元素,正常手动点击的话是会弹出账号登陆窗口的. 咱们启用网页分析工具按F9分析一下,发现这个肉眼看上去貌似是按钮的东西TA

Atitit.分区对索引的影响&#160;分区索引和全局索引&#160;attilax总结

Atitit.分区对索引的影响 分区索引和全局索引 attilax总结 1. 分区的好处1 2. 分区键:2 3. 分区的建议:2 4. 分区索引和全局索引:2 5. 全局索引就是在全表上创建索引, 3 6. 总结4 7. refer4 1. 分区的好处 在一个表的数据超过过2000万条或占用2G空间时,建议建立分区表 分区使得数据管理操作如数据装载.索引建立和重建.备份和恢复等在分区级别上完成,这比在表级完成操作要明显的节省时间: 分区可以提高性能,在很多情况下,查询可以通过扫描某个分区来完成

关于创建主键和索引的关系一个小小测试

创建主键时,所对应的列如果没有索引,数据库默认会自动创建一个索引:如果对于列有索引,那么创建主键不会再创建索引.这里要注意,列值必须满足主键的要求(唯一,非空),简单测试如下: SQL> create table wxlun_pri(a number); Table created. SQL> alter table wxlun_pri add constraint PRIMARY_KEY_REPLY primary key (a);     ------创建主键约束 Table altere

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

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

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

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

一个分区挂载到两个目录如何删除另一个

有时候我们会不小心挂载一个分区到两个目录下面,我们可以通过一下方式删除: sudo vi /etc/fstab ,删除/dev/xvdb1 /mnt ext3 defaults 0 0 这行就行 不会出现什么问题的,留着也没事 一个分区挂载到两个目录如何删除另一个,布布扣,bubuko.com

一个分区挂载到两个文件夹怎样删除还有一个

有时候我们会不小心挂载一个分区到两个文件夹以下,我们能够通过一下方式删除: sudo vi /etc/fstab ,删除/dev/xvdb1 /mnt ext3 defaults 0 0 这行即可 不会出现什么问题的,留着也没事