|
|
关于halaer的中间表的做法,我在100万条数据的表中做了测试,响应时间和我的语句的基本相同。(索引是moni_time列的索引).
drop table hits;
/
create table hits( sess_id number, seqno number, rid rowid, primary
key(sess_id,seqno) );
/
declare
cnt integer;
begin
cnt := 0;
for y in ( select rrid FROM (SELECT ROWNUM rno, rid rrid
FROM (SELECT ROWID rid
FROM cstmonilog2
WHERE moni_area = '9'
AND moni_typeid = '1'
AND moni_flag = '1'
ORDER BY moni_time) where rownum<=900035)
WHERE rno >=900000)
loop
cnt := cnt + 1;
insert into hits values ( userenv('sessionid'), cnt, y.rrid );
end loop;
end;
/
SELECT a.ROWID, a.moni_time, a.moni_type, a.moni_aperrcode, a.moni_constant,
SUBSTR (a.moni_userinfo, 1, 50) moni_userinfo
FROM cstmonilog2 a,(select * from hits where sess_id=userenv('sessionid')) b
where a.rowid=b.rid;
/
通常执行时,只执行后两部分,相应时间分别是7:22和5.47秒,总共为12.69秒。其中少了一个删除该session在hits表已有记录的动作。
我采用的语句
SELECT a.ROWID, a.moni_time, a.moni_type, a.moni_aperrcode, a.moni_constant,
SUBSTR (a.moni_userinfo, 1, 50) moni_userinfo
FROM cstmonilog2 a,
(SELECT rid
FROM (SELECT ROWNUM rno, rid
FROM (SELECT ROWID rid
FROM cstmonilog2
WHERE moni_area = '9'
AND moni_typeid = '1'
AND moni_flag = '1'
ORDER BY moni_time) where rownum<900035) --changed
WHERE rno >= 900000) b --changed
WHERE a.ROWID = b.rid
ORDER BY A.moni_time
执行时间是12.98秒
两者在执行效率上基本相同,因为在内部机制上也基本相同。不知道我的测试是否正确。 |
|