Oracle数据库添加索引注意事项

1.确定是否有专门的索引空间。

--查看表所在的表空间

SELECT * FROM user_tables t WHERE t.table_name='TABLENAME';

--查看索引所在的索引空间

SELECT TABLESPACE_NAME FROM DBA_INDEXES WHERE INDEX_NAME='INDEXNAME';

2.预估建立索引所需的空间大小。

3.查看表空间剩余或者索引空间剩余。

--查看空间剩余

SELECT tablespace_name,sum(bytes)/1024/1024 free_space FROM dba_free_space where

TABLESPACE_NAME='TABLESPACENAME' GROUP BY tablespace_name;

4.如果表空间不足,则考虑增加表空间。根据实际情况预估所要增加的表空间大小。

ALTER TABLESPACE TABLESPACENAME ADD DATAFILE '\oracle\oradata\anita_20180123.dbf' SIZE 3000m;

5.执行建立索引的sql脚本。

CREATE INDEX SCHEMA.INDEXNAME ONSCHEMA.TABLENAME(COLUMN) TABLESPACETABLESPACENAME ONLINE;

6.收集统计信息。

EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 'SCHEMA',TABNAME => 'TABLENAME',CASCADE

=> TRUE);

7.查看统计信息更新时间是否为当前时间。

SELECT A.OWNER,A.TABLE_NAME,A.LAST_ANALYZED FROM DBA_TABLES A WHERE

A.TABLE_NAME='TABLENAME';

8.查看索引的更新时间是否为当前时间。

SELECT B.OWNER,B.INDEX_NAME,B.LAST_ANALYZED FROM DBA_INDEXES B WHERE

B.INDEX_NAME='INDEXNAME';

9.查看一下sql语句的执行计划,索引是否生效。

--先设置一下session

alter session set statistics_level=all

--执行完要查看计划的sql后,执行下面脚本

select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

注意事项:

1.建立索引过程中可能会发生锁表现象。建议加上online关键字。

2.如果数据量很大,则建立索引和收集统计信息的时间会很长。(5kw的数据量建立索引花费332s,收集统计信息花费448s,仅供参考)。

3.注意大小写,表名,表空间名,索引名要全部大写。

4.添加索引会引起更新和插入速度变慢,这个需要DBA自己估算可行性。

5.如果发生锁表情况,则杀死锁表的进程,尝试执行下面sql:

--查看哪个对象锁表。

select session_id from v$locked_object;

select sid,serial#,username,osuser from v$session where sid =1999;

alter system kill session '1999,29133';

你可能感兴趣的:(Oracle)