欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

oracle分区大批量update,Oracle 对分区作调整记得加update global indexes

发布时间:2024/9/30 编程问答 58 豆豆
生活随笔 收集整理的这篇文章主要介绍了 oracle分区大批量update,Oracle 对分区作调整记得加update global indexes 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

Oracle 对分区做调整记得加update global indexes

在对分区做ddl操作时,会使分区全局索引失效,需要加上关键字update global indexes。

SQL> select * from v$version;

BANNER

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

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

PL/SQL Release 11.2.0.1.0 - Production

CORE    11.2.0.1.0      Production

TNS for 32-bit Windows: Version 11.2.0.1.0 - Production

NLSRTL Version 11.2.0.1.0 - Production

drop table t_range purge;

create table t_range (id number not null PRIMARY KEY, test_date date)

partition by range (test_date)

(

partition p_2014_11 values less than (to_date('2014-11-01', 'yyyy-mm-dd')),

partition p_2014_12 values less than (to_date('2014-12-01', 'yyyy-mm-dd')),

partition p_2015_01 values less than (to_date('2015-01-01', 'yyyy-mm-dd')),

partition p_2015_02 values less than (to_date('2015-02-01', 'yyyy-mm-dd')),

partition p_2015_03 values less than (to_date('2015-03-01', 'yyyy-mm-dd'))

);

insert /*+append */ into t_range  select rownum,

to_date(to_char(sysdate - 140, 'J') +

trunc(dbms_random.value(0, 80)),

'J')

from dual

connect by rownum <= 100000;

create index ind_t_range_date on t_range(test_date) nologging;

select * from t_range;

exec dbms_stats.gather_table_stats(user,'t_range',cascade => true);

set autotrace traceonly

select /*+index(t_range ind_t_range_date)*/count(1) from t_range where

test_date = TO_DATE('2015-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss');

执行计划

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

Plan hash value: 2542800765

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

| Id  | Operation         | Name             | Rows  | Bytes | Cost (%CPU)| Time     |

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

|   0 | SELECT STATEMENT  |                  |     1 |     8 |    23   (0)| 00:00:01 |

|   1 |  SORT AGGREGATE   |                  |     1 |     8 |            |          |

|*  2 |   INDEX RANGE SCAN| IND_T_RANGE_DATE |  1243 |  9944 |    23   (0)| 00:00:01 |

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

Predicate Information (identified by operation id):

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

2 - access("TEST_DATE"=TO_DATE(' 2015-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))

统计信息

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

1  recursive calls

0  db block gets

6  consistent gets

0  physical reads

0  redo size

424  bytes sent via SQL*Net to client

415  bytes received via SQL*Net from client

2  SQL*Net roundtrips to/from client

0  sorts (memory)

0  sorts (disk)

1  rows processed

set autotrace off

alter table t_range drop partition p_2014_11;

set autotrace traceonly

select /*+index(t_range ind_t_range_date)*/count(1) from t_range where

test_date = TO_DATE('2015-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss');

select /*+index(t_range ind_t_range_date)*/count(1) from t_range where

*

第 1 行出现错误:

ORA-01502: 索引 'TEST.IND_T_RANGE_DATE' 或这类索引的分区处于不可用状态

set autotrace off;

alter index ind_t_range_date rebuild nologging;

alter table t_range drop partition p_2014_12 update global indexes;

set autotrace traceonly

select /*+index(t_range ind_t_range_date)*/count(1) from t_range where

test_date = TO_DATE('2015-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss');

执行计划

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

Plan hash value: 2542800765

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

| Id  | Operation         | Name             | Rows  | Bytes | Cost (%CPU)| Time     |

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

|   0 | SELECT STATEMENT  |                  |     1 |     8 |    13   (0)| 00:00:01 |

|   1 |  SORT AGGREGATE   |                  |     1 |     8 |            |          |

|*  2 |   INDEX RANGE SCAN| IND_T_RANGE_DATE |  1243 |  9944 |    13   (0)| 00:00:01 |

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

Predicate Information (identified by operation id):

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

2 - access("TEST_DATE"=TO_DATE(' 2015-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))

统计信息

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

1  recursive calls

0  db block gets

6  consistent gets

0  physical reads

0  redo size

424  bytes sent via SQL*Net to client

415  bytes received via SQL*Net from client

2  SQL*Net roundtrips to/from client

0  sorts (memory)

0  sorts (disk)

1  rows processed

set autotrace off;

总结

以上是生活随笔为你收集整理的oracle分区大批量update,Oracle 对分区作调整记得加update global indexes的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。