创建两个表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 ) //????
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 ) //????
解决方案 »
- ORACLE 新手求助 查询结果表按照分号分隔开并分组问题
- oracle中做view时,怎么把case语句作为条件语句
- Oracle数据库导入问题
- 急...对不起,我没分了
- PL/SQL如何輸出99乘法表
- 这个 sql语句怎么写(急)
- 有没有一个通用的分页sql语句,可以在任何数据库上使用的sql
- oracleorahome92tnslistener服务不能启动提示说:错误3,系统找不到指定的路径
- 如何确定主机的data gatherer是否启动?
- Solaris+Oracle+Apache+JavaBean问题
- 聚合函数怎么用的啊,最好举个例子,马上结贴
- 好消息,好消息,100分送一楼,马上给分了,
索引是varchar2类型的,100是number型,故未使用使用。select * from tx1 where txtd = (select txtd from tx2 ) ;
两边类型相同,故可能走索引,要看CBO计算了,如果结果集比较大,也可能全表扫描。
如果 select txtd from tx2 返回只有一个结果那会不会用到索引?因为 select txtd from tx2 返回的结果肯定不带引号,所以我认为他不会使用到索引。
如果返回一个结果可能会使用索引,两者的类型相同。这和带不带引号没什么关系
上面的例子不走索引是因为进行了隐式转换,即
select * from tx where to_number(txtd)=100;
因此不会走索引,除非再建个to_number(txtd)的函数索引
但是外面的查询可能返回多个结果,txtd在tx1中并非唯一。
如果父查询返回的结果占tx1所有数据比例比较大,不排除全表扫描可能!