索引的使用是很讲究的,例如:
1、要在where条件中引用
2、联合索引中,where条件一定是索引中的第一列
3、索引的类型是什么,不同的索引类型是适应不同的列类型的
4、where条件中是否用到like和null值比较,用到的话索引都是不会生效的
5、并不是说建的索引多就能提高效率,索引建立的不好,反而会降低效率
6、建立索引后还要看查询的返回值,一般索引返回值不超过全部数据的20%暂时列一些,有空再整理,大家多多补充

解决方案 »

  1.   

    bigddaddy(隐者) ( ) 
       请得很全面
      

  2.   

    谢谢bigddaddy,有几点还是不太明白:
    1、要在where条件中引用
    2、联合索引中,where条件一定是索引中的第一列
    >>联合索引是否就是指多个字段构成同一个索引,例如复合主键?
    “where条件一定是索引中的第一列”的意思是?
    3、索引的类型是什么,不同的索引类型是适应不同的列类型的
    >>请问,索引类型有那些?
    4、where条件中是否用到like和null值比较,用到的话索引都是不会生效的
    >>您的意思是,如果写了 xxx.column like "a%", if column has null value, 查询将不会使用到索引文件,而导致速度很慢,是这样吗?5、并不是说建的索引多就能提高效率,索引建立的不好,反而会降低效率
    >>请问,你指的降低效率是指降低Insert,update的效率,还是指降低查询的效率?6、建立索引后还要看查询的返回值,一般索引返回值不超过全部数据的20%
    >>“一般索引返回值不超过全部数据的20%”——不是很理解这个意思。
    还有,请问如何看查询返回值?
    还有,就是存在这样的可以打开,关闭索引功能的系统函数吗?
    这里有一篇相关的文章: <a href="
    http://www.vchelp.net/cndevforum/subject_view.asp?subject_id=55663&forum_id=72">click</a>
      

  3.   

    执行rdbms\utlxplan.sql文件,然后set autotrace on则可以跟踪语句的运行情况和有无使用到索引
    建议看看http://www.itpub.net/showthread.php?threadid=219586&pagenumber=说的这本书
      

  4.   

    补充一下
    1索引列无函数转换
    2like查询第一个字符不能为通配符
    3is null或者is not null 不能使用索引
    4使用index或者no_index 提示
      

  5.   

    以下情况不使用索引
    select * from tablename where id+0=1  
                            where user_name||''= 'smith'
                            where to_number(字段)=4
                            where user_name like '%D'
                            where user_name like 'D%'
                            where user_name like '%D%'
                            where user_name like 'D%D'
                            where to_char(字段)='k'
                            where nvl(字段,'0')='3'
                            where to_date(字段)
                            ......
    --以上排除建了函数索引的情况,如果想用索引则建立函数索引.
      

  6.   

    一个语句是否用了索引,可以这么执行一下:
    explain plan set statement_id='标识' for select ....
    然后
    select * from plan_table a where a.statement_id='标识' 
    就可以看一个语句的执行计划.包括是否使用了索引等.