biti_rainy提供的如下代码效率明显提高:
(测试的是5000条记录)
------------------------------------------------------------------------------------
declare
i number := 1;
begin
for c in (select /*+ all_rows */v from test group by v order by v desc) loop
update test set o = i where v = c.v;
i := i + 1;
end loop;
end;
/
实际(值):73600
------------------------------------------------------------------------------------
一分钟左右。
用以下语句则要慢些
select /*+ first_rows */v from test group by v order by v desc
实际(值):85740
------------------------------------------------------------------------------------
nyfor的方法结果是:
如果记录数是5000条,不到二分钟(实际(值):115450)
------------------------------------------------------------------------------------
SQL> update test set o =
2 (select tmp.rn from
3 (select rowid rid,row_number() over (order by v desc) rn from test) tmp
4 where test.rowid = tmp.rid);
update test set o =
*
ERROR 位于第 1 行:
ORA-00439: 未启用特征: OLAP Window Functions
declare
i integer :=0;
pre_v float;
begin
for c in (select rowid rid,v from test order by v desc) loop
if (c.v !=pre_v or i=0) then
i := i + 1;
pre_v:=c.v;
end if;
update test set o = i where rowid = c.rid;
end loop;
end;