索引的重建

一、何时需要重建索引

  1. 表上频繁发生update,delete操作;
  2. 表上发生了alter table ..move操作(move操作导致了rowid变化)。

二、判断某索引是否应被重建

1、索引重建是否有必要,一般看索引是否倾斜的严重,是否浪费了空间,那应该如何才可以判断索引是否倾斜的严重,是否浪费了空间,对索引进行结构分析:
SQL> analyze index index_name validate structure;

2、在相同的session中查询index_stats表
SQL> select height,DEL_LF_ROWS/LF_ROWS from index_stats;
当查询的height>=4(索引的深度,即从根到叶节点的高度)或DEL_LF_ROWS/LF_ROWS>0.2的情况下,就应该考虑重建该索引。

三、如何执行重建索引的操作

1、drop原索引,然后再创建索引

SQL> drop index index_name;
SQL> create index index_name on table_name (index_column);
上述方法相当耗时间,不建议使用。

2 、直接重建索引

SQL> alter index indexname rebuild;
SQL> alter index indexname rebuild online;
此方法较快,建议使用。

rebuild是快速重建索引的一种有效的办法,因为它是一种使用现有索引项来重建新索引的方法。如果重建索引时有其他用户在对这个表操作,尽量使用带online参数来最大限度的减少索引重建时将会出现的任何加锁问题。由于新旧索引在建立时同时存在,因此,使用这种重建方法需要有额外的磁盘空间可供临时使用,当索引建完后把老索引删除,如果没有成功,也不会影响原来的索引。利用这种办法可以用来将一个索引移到新的表空间。

四、alter index rebuild内部过程和注意事项

Rebuild创建索引的内部过程:

  1. 扫描方式不同。Rebuild以index fast full scan或table full scan方式(到底采用那种方式取决于cost)读取原索引中的数据来构建一个新的索引,重建过程中有排序操作,rebuild online执行表扫描获取数据,重建过程中有排序的操作;
  2. 是否阻塞DML操作。Rebuild会阻塞DML操作,rebuild online不会阻塞DML操作 ;
  3. rebuild online时系统会产生一个SYS_JOURNAL_xxx的IOT类型的系统临时日志表,所有rebuild online时索引的变化都记录在这个表中,当新的索引创建完成后,把这个表的记录维护到新的索引中去,然后drop掉旧的索引,rebuild online就完成了。

示例一、用rebuild方式重建索引的

SQL> explain plan for alter index DBUSRPOS.PK_REPORTREG rebuild;

Explained.

SQL> set lines 150

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 1405161665

---------------------------------------------------------------------------------------
| Id  | Operation              | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | ALTER INDEX STATEMENT  |              |    41 |   246 |     1   (0)| 00:00:01 |
|   1 |  INDEX BUILD UNIQUE    | PK_REPORTREG |       |       |            |          |
|   2 |   SORT CREATE INDEX    |              |    41 |   246 |            |          |
|   3 |    INDEX FAST FULL SCAN| PK_REPORTREG |    41 |   246 |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------------------

示例二、用rebuild online方式重建索引

SQL> explain plan for alter index DBUSRPOS.PK_PRIVATEPARA rebuild online;

Explained.

SQL> set lines 150

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 3437353873

----------------------------------------------------------------------------------------
| Id  | Operation             | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------
|   0 | ALTER INDEX STATEMENT |                |    94 |   282 |     1   (0)| 00:00:01 |
|   1 |  INDEX BUILD UNIQUE   | PK_PRIVATEPARA |       |       |            |          |
|   2 |   SORT CREATE INDEX   |                |    94 |   282 |            |          |
|   3 |    TABLE ACCESS FULL  | PRIVATEPARA    |    94 |   282 |     1   (0)| 00:00:01 |
----------------------------------------------------------------------------------------

重建索引过程中的注意事项:

  1. 执行rebuild操作时,需要检查表空间是否足够;
  2. 虽然说rebuild online操作允许DML操作,但还是建议在业务不繁忙时间段进行;
  3. Rebuild操作会产生大量Redo Log;

五、重建分区表上的分区索引

SQL> alter index indexname rebuild partition paritionname tablespace tablespacename;
SQL> alter index indexname rebuild subpartition partitioname tablespace tablespacename;

 

时间: 2024-10-12 12:37:31

索引的重建的相关文章

mysql 创建索引、重建索引、查询索引、删除索引 转自:http://www.phpernote.com/mysql/942.html

本篇文章主要是对MySQL索引操作方法做了一下总结,包括创建索引.重建索引.查询索引.删除索引的操作.以下所列示例中中 `table_name` 表示数据表名,`index_name` 表示索引名,column list 表示字段列表(如:`id`,`order_id`). 1.创建索引 索引的创建可以在CREATE TABLE语句中进行,也可以单独用CREATE INDEX或ALTER TABLE来给表增加索引.以下命令语句分别展示了如何创建主键索引(PRIMARY KEY),联合索引(UNI

MongoDB索引管理——创建索引,查看索引,删除索引,重建索引

先给users集合插入两条记录,然后用users集合来进行索引管理的演示: > user1={"name":"liming","age":20,"gender":"F"} { "name" : "liming", "age" : 20, "gender" : "F" } > db.users.in

索引的重建与查询

sp_helpindex 'tablename' ---------------------------------------------------------------------------------- --查询当前数据库的所有索引值 SELECT database_id,object_id,index_id,object_name(object_id) as table_name, avg_fragmentation_in_percent,fragment_count, avg_f

PLSQL_性能优化系列15_Oracle Index Rebuild索引重建

2014-10-04 BaoXinjian 一.摘要 索引重建是一个争论不休被不断热烈讨论的议题.当然Oracle官方也有自己的观点,我们很多DBA也是遵循这一准则来重建索引,那就是Oracle建议对于索引深度超过4级以及已删除的索引条目至少占有现有索引条目总数的20% 这2种情形下需要重建索引.近来Oracle也提出了一些与之相反的观点,就是强烈建议不要定期重建索引.本文是参考了1525787.1并进行相应描述. 1. 重建索引的理由 Oracle的B树索引随着时间的推移变得不平衡(误解) 索

ORACLE关于索引是否需要定期重建争论的整理

ORACLE数据库中的索引到底要不要定期重建呢? 如果不需要定期重建,那么理由是什么? 如果需要定期重建,那么理由又是什么?另外,如果需要定期重建,那么满足那些条件的索引才需要重建呢?关于这个问题,网上也有很多争论,也一直让我有点困惑,因为总有点不得庐山真面目的感觉,直到上周看到了一些资料,遂整理于此,方便以后翻阅: 首先来看看网上关于索引需要重建的原因或标准: 一:分析(analyze)指定索引之后,查询index_stats的height字段的值,如果这个值>=4 ,最好重建(rebuild

PLSQL_性能优化系列13_Oracle Index Rebuild索引重建

2014-10-04 BaoXinjian 一.摘要 索引重建是一个争论不休被不断热烈讨论的议题.当然Oracle官方也有自己的观点,我们很多DBA也是遵循这一准则来重建索引,那就是Oracle建议对于索引深度超过4级以及已删除的索引条目至少占有现有索引条目总数的20% 这2种情形下需要重建索引.近来Oracle也提出了一些与之相反的观点,就是强烈建议不要定期重建索引.本文是参考了1525787.1并进行相应描述. 1. 重建索引的理由 Oracle的B树索引随着时间的推移变得不平衡(误解) 索

oracle查询优化,存储过程select表循环插入另一个表,以及索引重建

查询语句pl/sql中用F5优化语句 ORACLE的explain plan工具的作用只有一个,获取语句的执行计划1.语句本身并不执行,ORACLE根据优化器产生理论上的执行计划2.语句的分析结果存放在表PLAN TABLE中 select * from TABLE where NOWTIME >=to_date('20160101','yyyy-mm-dd') and NOWTIME < to_date('20160102','yyyy-mm-dd') 通过截图显示select语句是走索引的

DBCC DBREINDEX重建索引提高SQL Server性能

大多数SQL Server表需要索引来提高数据的访问速度,如果没有索引,SQL Server 要进行表格扫描读取表中的每一个记录才能找到索要的数据.索引可以分为簇索引和非簇索引,簇索引通过重排表中的数据来提高数据的访问速度,而非簇索引则通过维护表中的数据指针来提高数据的索引. 1. 索引的体系结构 为什么要不断的维护表的索引?首先,简单介绍一下索引的体系结构.SQL Server在硬盘中用8KB页面在数据库文件内存放数据.缺省情况下这些页面及其包含的数据是无组织的.为了使混乱变为有序,就要生成索

[转]Oracle 重建索引的必要性

http://blog.csdn.net/leshami/article/details/23763963 索引重建是一个争论不休被不断热烈讨论的议题.当然Oracle官方也有自己的观点,我们很多DBA也是遵循这一准则来重建索引,那就是Oracle建议对于索引深度超过4级以及已删除的索引条目至少占有现有索引条目总数的20% 这2种情形下需要重建索引.近来Oracle也提出了一些与之相反的观点,就是强烈建议不要定期重建索引.本文是参考了1525787.1并进行相应描述. 1.重建索引的理由 a.O