创建两个表tx1 和 tx2,并在txtd上建立索引:
create table tx1(txtd varchar2(100) ,name varchar2(100) );
create index idx_txtd1 on tx1(txtd);create table tx2(txtd varchar2(100) ,name varchar2(100) );
create index idx_txtd1 on tx2(txtd);据说 select * from tx where txtd=100; 这种查询方式会发生类型转换用不到索引 那么下面的方式是否也不会用到索引:
select * from tx1 where txtd = (select txtd  from tx2 ) //????

解决方案 »

  1.   

    select * from tx where txtd=100;
    索引是varchar2类型的,100是number型,故未使用使用。select * from tx1 where txtd = (select txtd  from tx2 ) ;
    两边类型相同,故可能走索引,要看CBO计算了,如果结果集比较大,也可能全表扫描。
      

  2.   


    如果 select txtd  from tx2  返回只有一个结果那会不会用到索引?因为 select txtd  from tx2 返回的结果肯定不带引号,所以我认为他不会使用到索引。
      

  3.   

    如果返回多个结果会出错
    如果返回一个结果可能会使用索引,两者的类型相同。这和带不带引号没什么关系
    上面的例子不走索引是因为进行了隐式转换,即
    select * from tx where to_number(txtd)=100; 
    因此不会走索引,除非再建个to_number(txtd)的函数索引
      

  4.   

    子查询返回多个结果会出错
    但是外面的查询可能返回多个结果,txtd在tx1中并非唯一。
    如果父查询返回的结果占tx1所有数据比例比较大,不排除全表扫描可能!
      

  5.   

    这个where子句中不能这么写吧!