表:t_guidangbak,字段id_no varchar2(18),有170万数据
建索引:create index inx_t_guidangbak_id_no on t_guidangbak(id_no)SQL> set timing on
(1)
SQL> declare l_id nvarchar2(18);
  2  l_orno varchar2(50);
  3  l_sql varchar2(100);
  4  begin
  5  l_id:='370481197711072218';
  6  l_sql:='select original_no from t_guidangbak where id_no=:id_no';
  7  execute immediate l_sql into l_orno using l_id;
  8  end;
  9  /PL/SQL 过程已成功完成。已用时间:  00: 00: 06.03
(2)
SQL> declare l_id varchar2(18);
  2  l_orno varchar2(50);
  3  l_sql varchar2(100);
  4  begin
  5  l_id:='370481197711072218';
  6  l_sql:='select original_no from t_guidangbak where id_no=:id_no';
  7  execute immediate l_sql into l_orno using l_id;
  8  end;
  9  /PL/SQL 过程已成功完成。已用时间:  00: 00: 00.00(1)和(2)的区别:
declare l_id nvarchar2(18);
declare l_id varchar2(18);
(1)中声明的l_id和字段id_no类型不一样
从执行用时来看,(1)和没建索引用时是差不多的,可见索引没起作用。
问题:索引为什么因为类型的不一样就没起作用?

解决方案 »

  1.   

    走不走索引不是从时间来看的。 要从执行计划来看.可以用Toad 或者PL/SQL dev ,点一下按钮就可以了SQLPLUS 里执行 EXPLAIN PLAN
     
    SQL>EXPLAIN PLAN FOR 你的sql语句; 
    如 
    SQL>EXPLAIN PLAN FOR SELECT * FROM EMP WHERE EMPNO=7369; 
    然后 
    SELECT plan_table_output 
      FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE')); 
    查看结果就是前面SQL语句的执行计划。 ------------------------------------------------------------------------------
    Blog: http://blog.csdn.net/tianlesoftware
    网上资源: http://tianlesoftware.download.csdn.net
    相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx
    Q Q 群:62697716 
      

  2.   

    顺便说一点,走索引不一定就会块,具体情况要具体对待,我们可以从执行计划的cost的来判断..
    在blog 中列的四种情况下,索引是不会被使用的。当然还有一些其他的原因. Oracle 限制索引 
    http://blog.csdn.net/tianlesoftware/archive/2009/10/15/4671674.aspx
    ------------------------------------------------------------------------------
    Blog: http://blog.csdn.net/tianlesoftware
    网上资源: http://tianlesoftware.download.csdn.net
    相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx
    Q Q 群:62697716