其实IN未必就是全表扫描,事实上x in (1,2)相当于x=1 or x=2,例如:
SQL> create table t
2(id int,
3name varchar2(20),
4constraint pk_t primary key (id)
5using index tablespace users);
表已创建。
SQL> insert into t
2values(1,'dfdsfsd');
已创建 1 行。
SQL> insert into t
2values(2,'dsfdsfsd');
已创建 1 行。
SQL> insert into t
2values(3,'fdsfds');
已创建 1 行。
SQL> commit;
提交完成。
SQL> exec dbms_stats.gather_table_stats('scott','t',cascade=>true);
PL/SQL 过程已成功完成。
SQL> select * from t
2
SQL> set autotrace traceonly explain;
SQL> select * from t
2where id in (1,3);
Execution Plan
----------------------------------------------------------
0SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=2 Bytes=22)
10 INLIST ITERATOR
21 TABLE ACCESS (BY INDEX ROWID) OF 'T' (TABLE) (Cost=2 Car
d=2 Bytes=22)
32 INDEX (RANGE SCAN) OF 'PK_T' (INDEX (UNIQUE)) (Cost=1
Card=2)
SQL>
|