SELECT rid FROM ( SELECT rowid rid FROM MID_CHANGELOG WHERE 1 = 1AND ostepnumber != '0' AND osubstepnumber = '0'ORDER BY operationtime DESC )
WHERE rownum between 1 and 5
这个语句其实是一个子查询,外层的查询通过该SQL查出来的rowid直接定位到表中的相应行才是。
该SQL执行计划如下:
已选择5行。
已用时间:00: 00: 00.05
Execution Plan
----------------------------------------------------------
0SELECT STATEMENT Optimizer=ALL_ROWS (Cost=7 Card=5 Bytes=60)
10 COUNT (STOPKEY)
21 FILTER
32 VIEW (Cost=7 Card=5 Bytes=60)
43 TABLE ACCESS (BY INDEX ROWID) OF 'MID_CHANGELOG' (TA
BLE) (Cost=7 Card=9419061 Bytes=235476525)
54
INDEX (FULL SCAN DESCENDING) OF 'I_CHANGELOG_OPERA
TIONTIME' (INDEX) (Cost=3 Card=7)
Statistics
----------------------------------------------------------
0recursive calls
0db block gets
8consistent gets
0physical reads
0redo size
307bytes sent via SQL*Net to client
277bytes received via SQL*Net from client
2SQL*Net roundtrips to/from client
0sorts (memory)
0sorts (disk)
5rows processed
加上外查询
SELECT id, parentid, objid, objtype, otypenumber, oapptypenumber, ostepnumber, osubstepnumber, ostatemsg, ostatenumber, o, operator, operationtime, eventtype, manualoperator, times,objectname, changes, bak1, bak2, bak3 FROM MID_CHANGELOG
WHERE rowid in
(SELECT rid FROM ( SELECT rowid rid FROM MID_CHANGELOG WHERE 1 = 1AND ostepnumber != '0' AND osubstepnumber = '0'ORDER BY operationtime DESC )
WHERE rownum between 1 and 5 )
感觉这个语句应该是可以通过直接根据前面子查询出来的rowid得到结果集吧[TABLE ACCESS (BY USER ROWID) OF 'MID_CHANGELOG'],
但结果原来的子查询反而走了FTS了。
执行计划如下:
已用时间:00: 00: 14.06
Execution Plan
----------------------------------------------------------
0SELECT STATEMENT Optimizer=ALL_ROWS (Cost=107623 Card=1 Byte
s=100)
10 NESTED LOOPS (Cost=107623 Card=1 Bytes=100)
21 VIEW OF 'VW_NSO_1' (VIEW) (Cost=107621 Card=5 Bytes=60)
32 HASH (UNIQUE)
43 COUNT (STOPKEY)
54 FILTER
65
VIEW (Cost=107621 Card=9419061 Bytes=113028732)
76
SORT (ORDER BY) (Cost=107621 Card=9419061 Byte
s=235476525)
87
TABLE ACCESS (FULL) OF 'MID_CHANGELOG' (TABL
E) (Cost=39585 Card=9419061 Bytes=235476525)
91 TABLE ACCESS (BY USER ROWID) OF 'MID_CHANGELOG' (TABLE)
(Cost=1 Card=1 Bytes=88)
Statistics
----------------------------------------------------------
249recursive calls
6db block gets
179592consistent gets
7307physical reads
0redo size
1335bytes sent via SQL*Net to client
278bytes received via SQL*Net from client
2SQL*Net roundtrips to/from client
0sorts (memory)
1sorts (disk)
5rows processed
执行计划中黑体部分为子查询执行变化的地方,
不解为什么会出现这种状况,请各位帮忙看看。
[ 本帖最后由 zhou2324 于 2010-10-16 21:45 编辑 ]
|