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';
————————————————
版权声明:本文为CSDN博主「L-zoe」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/w515165137/article/details/79256742