一直以为给数据库建立索引后,当进行查询的时候,如果用到了索引列作为查询条件就会有速度上的优势;今天 当要对一些SQL语句进行优化时,在网上查阅了一些资料,才发现索引的使用还有一些特别的讲究。
       下面转一篇网友的文章。

小议索引的使用

  

  

  

  

  

  

1. 主关键字的约束
   

  

alter table person add constraint person_pk primary key (id) using index storage (initial 1m next 1m pctincrease 0) tablespace prd_indexes ;
  
select last_name ,first_name ,salary from person where id = 289 ;

  

   2)一旦遇到一个大于设定值的条目,索引的顺序搜索可被终止。
2. ORDER BY中用索引

  

  

  

  

   例如: 

表DEPT包含以下列: 

DEPT_CODE PK NOT NULL
DEPT_DESC NOT NULL
DEPT_TYPE NULL
非唯一性的索引(DEPT_TYPE)
低效: (索引不被使用)
SELECT DEPT_CODE
FROM DEPT
ORDER BY DEPT_TYPE
高效: (使用索引)
SELECT DEPT_CODE
FROM DEPT
WHERE DEPT_TYPE > 0

3. 避免改变索引列的类型                        

  

  

SELECT … 
FROM EMP
WHERE EMPNO = ‘123'
  
SELECT …
FROM EMP
WHERE EMPNO = TO_NUMBER(‘123')
  
  
SELECT …
FROM EMP
WHERE EMP_TYPE = 123
  
SELECT …
FROM EMP
WHERE TO_NUMBER(EMP_TYPE)=123

  

4. 需要当心的WHERE子句

  

  

不使用索引:

SELECT ACCOUNT_NAME
FROM TRANSACTION
WHERE AMOUNT !=0;
使用索引:
SELECT ACCOUNT_NAME
FROM TRANSACTION
WHERE AMOUNT >0;

不使用索引:

SELECT ACCOUNT_NAME,AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME||ACCOUNT_TYPE='AMEXA';
使用索引:
SELECT ACCOUNT_NAME,AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME = ‘AMEX'
AND ACCOUNT_TYPE=' A';
  
不使用索引:
SELECT ACCOUNT_NAME, AMOUNT
FROM TRANSACTION
WHERE AMOUNT + 3000 >5000;
使用索引:
SELECT ACCOUNT_NAME, AMOUNT
FROM TRANSACTION
WHERE AMOUNT > 2000 ;
   下面的例子中,相同的索引列不能互相比较,这将会启用全表扫描。       
不使用索引:
SELECT ACCOUNT_NAME, AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME = NVL(:ACC_NAME,ACCOUNT_NAME);
使用索引:
SELECT ACCOUNT_NAME, AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME LIKE NVL(:ACC_NAME,'%');
  
CREATE INDEX EMP_I ON EMP (UPPER(ename)); /*建立基于函数的索引*/
SELECT * FROM emp WHERE UPPER(ename) = ‘BLACKSNAIL'; /*将使用索引*/

  

5. 怎样监控无用的索引

  

  

开始监控:alter index index_name monitoring usage;
检查使用状态:select * from v$object_usage;
停止监控:alter index index_name nomonitoring usag

e;

  

set heading off
set echo off
set feedback off
set pages 10000
spool start_index_monitor.sql
SELECT 'alter index '||owner||'.'||index_name||' monitoring usage;'
FROM dba_indexes
WHERE owner = USER;
spool off
set heading on
set echo on
set feedback on