Tom 的 Expert one on one: Oracle 的一个Bug. 第三章讲到DML所的时候 Tom 用了一个脚本:
tkyte@TKYTE816> select username, 2 v$lock.sid, 3 trunc(id1/power(2,16)) rbs, 4 bitand(id1,to_number('ffff','xxxx'))+0 slot, 5 id2 seq, 6 lmode, 7 request 8 from v$lock, v$session 9 where v$lock.type = 'TX' 10 and v$lock.sid = v$session.sid 11 and v$session.username = USER 12 / USERNAME SID RBS SLOT SEQ LMODE REQUEST -------- ---------- ---------- ---------- ---------- ---------- ---------- TKYTE 8 2 46 160 6 0
产品库上最好别直接用这个脚本,很慢很慢的.
解决的办法是加上一个Hint:
SELECT /*+ rule */ username, v$lock.SID, TRUNC (id1 / POWER (2, 16)) rbs, BITAND (id1, TO_NUMBER ('ffff', 'xxxx')) + 0 slot, id2 seq, lmode, request FROM v$lock, v$session WHERE v$lock.TYPE = 'TX' AND v$lock.SID = v$session.SID AND v$session.username = USER /
需要看optimzer_mode参数的设置了:)
考虑不周就是Bug了阿
fenng这次有点过于严以律人了。
tom的例子是帮助我们理解技术的,不是给dba做管理脚本用的。
另外像这种join多个v$表的情况,在不同版本的数据库上可能有不同的性能表现。像你那样加上hint,可能在其它版本中未必好。
总不能让他在书中写这段脚本的时候这样写吧?- 在8.1.x下用select /*+ hint1 */….., 在9.0.x下…., 在9.2.x下…..
:)
btw: tom好像不提倡在产品应用中使用hint。
总体上讲,这个SQL没有用途,所以我跳过去了…