QUOTE:
原帖由
zjuzsf 于 2008-5-7 07:04 发表

在11g里面 not in有了比较大变化,以前版本如果返回列可以为空不能使用anti join,在11g里面可以为null的也能使用anti join了
...
T@ORCL>select count(*) from tt WHERE OBJECT_ID NOT IN (SELECT OBJECT_ID FROM TT);
COUNT(*)
----------
0
Elapsed: 00:00:00.12
Execution Plan
----------------------------------------------------------
Plan hash value: 1524786397
------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 26 | | 743 (1)| 00:00:09 |
| 1 | SORT AGGREGATE | | 1 | 26 | | | |
|* 2 | HASH JOIN ANTI NA | | 1 | 26 | 1784K| 743 (1)| 00:00:09 |
| 3 | TABLE ACCESS FULL| TT | 72969 | 926K| | 284 (1)| 00:00:04 |
| 4 | TABLE ACCESS FULL| TT | 72969 | 926K| | 284 (1)| 00:00:04 |
------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("OBJECT_ID"="OBJECT_ID")
Note
-----
- dynamic sampling used for this statement
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
2032 consistent gets
0 physical reads
0 redo size
417 bytes sent via SQL*Net to client
416 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
filter 的性能实际上跟列值distinct数有关,oracle在执行的时候实际上做了很大优化,最坏情况下才会出现对外表每一行 执行一次filter操作,
如果distinct值比较少,那执行效率还是非常高的,这个优化11g之前就有,虽然是filter操作,但是实际执行情况可能不是完全按照filter那样的逻辑执行
...