楼主: shift

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

[复制链接]
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
31#
发表于 2003-3-13 15:53 | 只看该作者

更何况816以下

又如何来 OLAP func   

使用道具 举报

回复
论坛徽章:
0
32#
 楼主| 发表于 2003-3-13 16:33 | 只看该作者

确实更快了

这个坛子高人多!

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语句吗?不是太好理解啊。

感谢!!

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
33#
发表于 2003-3-13 17:07 | 只看该作者

这不过是 oracle的一种 优化器 模式 而已

这个叫 hints ,指定oracle 按照提示 生成执行计划

btw :

你应该尝试在该列建立索引
并且执行 alter session set sort_area_size = 10240000;

我想这样会快的多

使用道具 举报

回复
论坛徽章:
0
34#
发表于 2003-3-14 23:14 | 只看该作者
最初由 shift 发布
[B]今天试了一种情况,出现了一点问题。请看:

SQL> select * from test;

        V ......O
--------- ---------
      2.8
     11.8
     11.8
     17.8
      8.8

如果出现两个数相同的情况,得到的结果就不如意了:(

理想的结果应该是二个2,不出现5

-- lodge的算法
update test set o =
(select count(*) from test tmp
where tmp.v >= test.v);

select * from test;

   V..........O
---- ---------
2.8.........5
11.8.......3
11.8.......3
17.8.......1
8.8.........4
-----------------------------------------------------------------------------------------------
也不理想啊。

有理想的方案吗? [/B]


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

使用道具 举报

回复
论坛徽章:
59
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41灰彻蛋
日期:2011-10-28 14:15:35管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-02-18 11:43:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:15
35#
发表于 2003-3-15 00:52 | 只看该作者
最初由 lander 发布
[B]
update test set o =
(select count(distinct v)  + 1 from test tmp
where tmp.v > test.v); [/B]

多谢lander兄提醒, 这才想起来, count函数中能用distinct, 偶正犹豫是否多加一次中间检索(因担心被BITI同志批评, 没敢发言, 咳咳)

好久没写过SQL文了, 生疏了很多.

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
36#
发表于 2003-3-15 11:46 | 只看该作者

我晕

最初由 lodge 发布
[B]
多谢lander兄提醒, 这才想起来, count函数中能用distinct, 偶正犹豫是否多加一次中间检索(因担心被BITI同志批评, 没敢发言, 咳咳)

好久没写过SQL文了, 生疏了很多. [/B]


不是吧,不是这样子吧  

如果说话有什么得罪的地方请不要介意
仅仅就事论事,没有涉及到 人 的关系哟

欢迎大家指正我呢

btw : 我也很长时间没有写过了,一年了吧,都是看见别人写了才想起来

使用道具 举报

回复
论坛徽章:
59
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41灰彻蛋
日期:2011-10-28 14:15:35管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-02-18 11:43:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:15
37#
发表于 2003-3-15 15:38 | 只看该作者

Re: 我晕

最初由 biti_rainy 发布
[B]

不是吧,不是这样子吧  

如果说话有什么得罪的地方请不要介意
仅仅就事论事,没有涉及到 人 的关系哟

欢迎大家指正我呢

btw : 我也很长时间没有写过了,一年了吧,都是看见别人写了才想起来 [/B]

嘿嘿, 开个玩笑

使用道具 举报

回复
论坛徽章:
5
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-10-30 17:05:33蓝色妖姬
日期:2006-04-12 22:10:01会员2006贡献徽章
日期:2006-04-17 13:46:34
38#
发表于 2003-7-26 12:37 | 只看该作者

ORA-00439: 未启用特征: OLAP Window Functions

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

我用的是8。1。7,compatible参数已改,为什么还会出错?

使用道具 举报

回复
论坛徽章:
0
39#
发表于 2003-7-27 13:42 | 只看该作者
还是麻烦一点换来速度快

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;

使用道具 举报

回复
论坛徽章:
0
40#
发表于 2003-7-28 16:10 | 只看该作者
请教一下:其中的tmp是什么东东?

使用道具 举报

回复

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

本版积分规则 发表回复

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