楼主: shift

[精华] 谁提供的排序算法最优?

[复制链接]
论坛徽章:
1
祖国60周年纪念徽章
日期:2009-10-09 08:28:00
41#
发表于 2003-8-29 16:41 | 只看该作者
update test a set o= ( (select count(distinct v) +1  from test b where v>a.v) )

使用道具 举报

回复
论坛徽章:
0
42#
发表于 2003-9-27 22:50 | 只看该作者

呵呵,精彩啊

使用道具 举报

回复
论坛徽章:
0
43#
发表于 2003-9-28 12:03 | 只看该作者

Re: 确实更快了

最初由 shift 发布
[B]这个坛子高人多!

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)
------------------------------------------------------------------------------------

biti_rainy:能说明一下你的select语句吗?不是太好理解啊。

感谢!! [/B]






biti老兄,能告诉我为什么/* +first_rows*/反比/* +all_rows*/慢吗?好象前者的目的就是为了检索时间最少呀?

使用道具 举报

回复
论坛徽章:
1
2013年新春福章
日期:2013-02-25 14:51:24
44#
发表于 2004-3-30 17:44 | 只看该作者
不错的方法。

使用道具 举报

回复
论坛徽章:
0
45#
发表于 2004-5-31 21:44 | 只看该作者
太简单了吧,你先建立个龄时表
create table temp_test as
select v,rownum from test
order by v;
然后truncate table test
然后insert into test
select * from temp_test;
commit;
最后一点注意处理前备份

使用道具 举报

回复
论坛徽章:
0
46#
发表于 2004-6-1 14:48 | 只看该作者
不妨利用rownum来做替换,用过程来实现
select rownum,v from test   order by v desc来做游标,取出相应的m_rownum数,M_v值
然后update  test set o=rownum where v=m_v

使用道具 举报

回复
论坛徽章:
85
2008新春纪念徽章
日期:2008-02-13 12:43:03双黄蛋
日期:2011-06-17 11:07:502011新春纪念徽章
日期:2011-02-18 11:42:472011新春纪念徽章
日期:2011-01-04 10:24:022010年世界杯参赛球队:荷兰
日期:2010-08-28 00:09:112010年世界杯参赛球队:科特迪瓦
日期:2010-03-02 12:36:542010新春纪念徽章
日期:2010-03-01 11:07:242010新春纪念徽章
日期:2010-03-01 11:07:242010新春纪念徽章
日期:2010-01-04 08:33:082010年世界杯参赛球队:意大利
日期:2009-12-31 14:41:24
47#
发表于 2004-11-30 14:58 | 只看该作者
最初由 lander 发布
[B]

其实Lodge的算法(思路)是对的,只是你并不能照搬呀
update test set o =
(select count(distinct v)  + 1 from test tmp
where tmp.v > test.v); [/B]



SQL> update test set o =
  2  (select count(distinct v) + 1 from test tmp
  3  where tmp.v > test.v);

6 rows updated

SQL> select * from test;

         V          O
---------- ----------
       2.8          5
      22.8          1
      11.8          3
      17.8          2
       8.8          4
      17.8          2

还是有问题,这样一来统计的数就少了,原来有6条记录,结果的最大值才是5。

使用道具 举报

回复
论坛徽章:
0
48#
发表于 2004-12-12 21:30 | 只看该作者

thanks

thanks

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
38
ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14现任管理团队成员
日期:2012-10-18 17:11:21版主4段
日期:2012-05-15 15:24:112012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23
49#
发表于 2004-12-24 16:53 | 只看该作者
我感觉还是demmy(第3页)的语句简洁明了,稍微整理一下,看起来更清楚:
update test a set a.o=(select count(distinct b.v) +1 from test b where b.v>a.v);

使用道具 举报

回复
论坛徽章:
0
50#
发表于 2005-1-6 22:54 | 只看该作者
update test a
set v=(select count(1)+1 from
(select b.o,count(1) cs
from test b
group by b.o
) c
where a.o<c.o)

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表