|
原帖由 wabjtam123 于 2008-3-13 09:49 发表 ![]()
和RBO和从下到上无关
我分析了表,走了CBO,也一样可以查询
另外我表没分析,改变了AND的顺序,也可以查询
我的问题是奇怪的是,为什么只要有一个字段搞了索引,并且是正确的不转化的类型,另一个字段就可以隐试转化了
没有理解我说的意思。
补充测试:
SQL> select * from t1 where key_name=111 and id=2;
select * from t1 where key_name=111 and id=2
*
ERROR at line 1:
ORA-01722: invalid number
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | |
|* 1 | TABLE ACCESS BY INDEX ROWID| T1 | | | |
|* 2 | INDEX UNIQUE SCAN | PK_T1 | | | |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
1 - filter(TO_NUMBER("T1"."KEY_NAME")=111)
2 - access("T1"."ID"=2)
这里虽然通过index访问,但是由于符合查询条件的结果
SQL> select * from t1 where id=2;
ID KEY_NAME
---------- --------------------
2 sdaf11 --> 无法被隐式转为number,所以还是会报错,你执行的查询之所以没报错,是因为查询的结果key_name是可以转换成number
建议消除程序中潜在的隐式转换。
隐式转化将使该字段上的索引失去作用
SQL> drop index pk_t1;
Index dropped.
SQL> create index idx_t1_key_name on t1(key_name);
Index created.
SQL> explain plan for select * from t1 where key_name=111;
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | |
|* 1 | TABLE ACCESS FULL | T1 | | | |
--------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
1 - filter(TO_NUMBER("T1"."KEY_NAME")=111)
SQL> explain plan for select * from t1 where key_name='111';
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | |
| 1 | TABLE ACCESS BY INDEX ROWID| T1 | | | |
|* 2 | INDEX RANGE SCAN | IDX_T1_KEY_NAME | | | |
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
2 - access("T1"."KEY_NAME"='111') |
|