关闭

如何让ORACLE索引不起作用(不可见)

发表于:2012-3-26 10:28

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:yzsind    来源:51Testing软件测试网采编

  我们经常在数据库上建索引或删除索引,由于索引对SQL的执行性能影响非常大,有可能变得很好,也有可能变得很差,在线下开发环境我们可以充分测试,对于创建或删除索引没什么问题。但是在线上环境,由于高并发的访问,如果我们删除了一个重要的大索引(GB以上),删除后才发现大量SQL性能变差,很快主机就LOAD飙升,系统无法运行了,由于索引已经删除,并且很大,要当场重建基本不可能,因为这个索引巨大,创建估计要几分钟甚至几个小时,况且这时主机已经基本没有响应,IO全部用光,只能把应用停了,等索引建好后再开始打开应用,等发生这样的事才会为自己的失误而后悔。那我们有没有办法让删除索引的风险降低呢,请看下文:

  我们先创建一个表t1,在t1的table_name字段上新建一个索引idx_t1_table_name。

create table t1 as select * from all_tables;--创建表
create index idx_t1_table_name on t1(table_name); --创建索引
analyze table t1 compute statistics; --收集表的统计信息
 
用执行计划验证索引是否有效
SQL> explain plan for select count(*) from t1 where table_name='DUAL';
 
Explained
 
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
| Id  | Operation            |  Name              | Rows  | Bytes | Cost (%CPU)|
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |                    |     1 |    17 |     2  (50)|
|   1 |  SORT AGGREGATE      |                    |     1 |    17 |            |
|*  2 |   INDEX RANGE SCAN   | IDX_T1_TABLE_NAME  |     2 |    34 |     2  (50)|
--------------------------------------------------------------------------------

  OK,从上面我们可以看到索引很正常。那现在假设我们不再需要这个索引了,因此想删除它,但又不知道会不会有本文开头所说的风险。如果可以删除前先把索引不可见,确认没问题后再删除,这样就没问题了,为此,Oracle11g推出新的功能,设置索引是否可见,示例如下:

SQL> alter index IDX_T1_TABLE_NAME invisible;
 
Index altered
 
SQL>  explain plan for select count(*) from t1 where table_name='DUAL';
 
Explained
 
SQL>  SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
 
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------
| Id  | Operation            |  Name       | Rows  | Bytes | Cost (%CPU)|
-------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |             |     1 |    17 |    23  (22)|
|   1 |  SORT AGGREGATE      |             |     1 |    17 |            |
|*  2 |   TABLE ACCESS FULL  | T1          |     2 |    34 |    23  (22)|
-------------------------------------------------------------------------

这样索引就隐藏起来了,如果把索引隐藏后发现有性能问题,我们可以立即打开索引:
SQL> alter index IDX_T1_TABLE_NAME visible;
 
Index altered
 
SQL> explain plan for select count(*) from t1 where table_name='T1';
 
Explained
 
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3098159
--------------------------------------------------------------------------------
| Id  | Operation         | Name              | Rows  | Bytes | Cost (%CPU)| Tim
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |                   |     1 |    17 |     1   (0)| 00:
|   1 |  SORT AGGREGATE   |                   |     1 |    17 |            |
|*  2 |   INDEX RANGE SCAN| IDX_T1_TABLE_NAME |     1 |    17 |     1   (0)| 00:
--------------------------------------------------------------------------------

 

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号