关于ORACLE效率的2个小问题

xxiao07 2008-04-03 03:45:56
一、我有集几亿条记录表,曾经要做借贷方合计的查询,向请教用游标与不用游标哪个效率高?

a.用游标CURSOR cursor_name IS select 借贷标志,sum(金额) from tab where 日期=..... group by 借贷标志;


b.不用游标 ,用2个SQL查询:
select sum(金额) into v_amt1 from tab where 日期=..... 借贷标志=‘1’;
select sum(金额) from v_amt2 from tab where 日期=..... 借贷标志=‘2’;

二、由于数据庞大,估计我一个存储过程处理5年的数据需要200小时才能完成。我的服务有8个CPU,请问按年份用5个进程并行处理要比一个进程处理5年的数据要快,是吗?
...全文
217 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
第一个问题:能不用游标就不要用游标,用游标的效率低 ?
其实游标很多地方都用,显示游标跟隐式游标。
我觉得显示游标效率还高点。你所谓的不用游标我看很难,就连update都是隐式游标的,难道这你称为不用游标?
叶子 2008-04-09
  • 打赏
  • 举报
回复
up
sulins 2008-04-08
  • 打赏
  • 举报
回复
细看你的SQL,发现表PTHSADTL和PTHSADTL在做笛卡儿积运算。
应该是你不小心遗漏了连接条件。
liukang520236 2008-04-08
  • 打赏
  • 举报
回复
第一个问题:能不用游标就不要用游标,用游标的效率低

第二个问题:对这个不是狠了解,个人认为并行应该会比一个进程快
凤影 2008-04-08
  • 打赏
  • 举报
回复
很不幸的告诉你,总低。

叶子 2008-04-08
  • 打赏
  • 举报
回复
第一个问题:能不用游标就不要用游标,用游标的效率低 ?
分情况吧,我觉得游标也挺好用,有的时候效率低,不是总低吧?
xxiao07 2008-04-08
  • 打赏
  • 举报
回复
SQL的执行计划用什么工具可以分析?
ykttyk 2008-04-07
  • 打赏
  • 举报
回复
怕怕。。。。。差不多十天,得出一个结果要十天,你的老大愿意等嘛?
凤影 2008-04-07
  • 打赏
  • 举报
回复
两百小时,我汗。
chengjian2008 2008-04-07
  • 打赏
  • 举报
回复
第一个问题:肯定是不用游标快
第二个问题:因为数据量大,你用一个存储过程一下子处理这么多的数据肯定是不明智的,同意楼上的,把数据按年分开(甚至可以按半年分开,根据数据量而定)分开处理,肯定快多了.
sulins 2008-04-07
  • 打赏
  • 举报
回复
1、若“借贷标志”就1和2两种可能值,用游标性能影响不大。
最好的方案是:
select
sum(decode(借贷标志, '1', 金额, 0)) into v_amt1,
sum(decode(借贷标志, '2', 金额, 0)) into v_amt2
from tab
where 日期=..... ;

2、并行处理,对多表关联的SQL效果明显。
几亿条记录,200小时,说明有很大的优化空间。
1)单笔处理可否转化成批量处理
2)确认是否合理使用表分区;
3)确认是否建立索引,或者是否合理使用到索引;
……
SYUEHOKO 2008-04-07
  • 打赏
  • 举报
回复
200个小时,难以想象.
wtk13 2008-04-06
  • 打赏
  • 举报
回复
先分析一个执行计划看看,这么干说也没办法分析
另外并不是所有SQL语句都是能优化的,如果结构的不合理,神仙也弄不出来
我原来接触的业务才几百万,怎么也不行,必须改动结构增加一个冗余列才可能提高

另外建议不要使用游标,对数据库的性能消耗比较大,
还有就是数据库的一些参数上是否还有可优化的余地.
还要看数据库的CPU,内存,磁盘阵列,等很多因素.
hiairfly 2008-04-05
  • 打赏
  • 举报
回复
分析一下这个SQL的执行计划,看能否调优。
[Quote=引用 9 楼 xxiao07 的回复:]
索引、分区等都有,只是逻辑太复杂,数据量大得惊人!!其中有:

select 发生额A,发生额B,余额A,余额B ,入帐日期A,入帐日期B,入帐时间A,入帐时间B
into
AMTa,AMTb,BALa, BALb, DATEa,DATEb,TIMEa,TIMEb,TIMECAPTIONA,TIMECAPTIONB
from
(
select rank() over(partition by 帐号b order by 时间差 ) rk, c.* from
(
select a.发生额 发生额A, b.发生额 发生额B,
a.余额 余额A, b.余额 余额B, a.时…
[/Quote]
xxiao07 2008-04-04
  • 打赏
  • 举报
回复
我感觉是to_date () 效率很低引起的
onefours 2008-04-03
  • 打赏
  • 举报
回复
200小时?你怎么得到的?等了8天8夜?

看最后的sql,你的输出肯定是rank() over(partition by 帐号b order by 时间差 )的第一个,这样, 我们能不能就只从 (帐号b 时间差 )的第一个 中间做查询呢?显然可以(估计使用materialized view会有很好的性能)
wffffc 2008-04-03
  • 打赏
  • 举报
回复
200个小时的查询我觉得绝对是有问题的,何况你的数据也只不过是几亿条,绝对不可能要这么长时间的,看看你的存储过程是不是有问题吧
xxiao07 2008-04-03
  • 打赏
  • 举报
回复
索引、分区等都有,只是逻辑太复杂,数据量大得惊人!!其中有:

select 发生额A,发生额B,余额A,余额B ,入帐日期A,入帐日期B,入帐时间A,入帐时间B
into
AMTa,AMTb,BALa, BALb, DATEa,DATEb,TIMEa,TIMEb,TIMECAPTIONA,TIMECAPTIONB
from
(
select rank() over(partition by 帐号b order by 时间差 ) rk, c.* from
(
select a.发生额 发生额A, b.发生额 发生额B,
a.余额 余额A, b.余额 余额B, a.时间标签 时间标签A,b.时间标签 时间标签B,
a.入帐日期 入帐日期A, b.入帐日期 入帐日期B,
a.入帐时间 入帐时间A, b.入帐时间 入帐时间B,
(a.发生额 -b.发生额) / b.发生额 as 差额比,
b.帐号 帐号b,
(to_date(b.入帐日期 || b.入帐时间,'yyyy-mm-dd HH24.MI.SS')- to_date(a.入帐日期 || a.入帐时间,'yyyy-mm-dd HH24.MI.SS')) *3600*24 as 时间差
from PTHSADTL a ,PTHSADTL b

where a.帐号=acc1 and a.借贷标志='1' and abs( (to_number(a.发生额) - amt1 )/ amt1 )<0.5
and b.帐号=acc2 and b.借贷标志='2' and abs( (to_number(b.发生额) - amt1 )/ amt1 )<0.5
and to_date(a.入帐日期 || a.入帐时间,'yyyy-mm-dd HH24.MI.SS') <= to_date( b.入帐日期 || b.入帐时间,'yyyy-mm-dd HH24.MI.SS')

and to_date(a.入帐日期 || a.入帐时间,'yyyy-mm-dd HH24.MI.SS')
between to_date(date2,'yyyy-mm-dd') - 15 and TO_DATE(date2||time2,'YYYY-MM-DDHH24.MI.SS')
and to_date(b.入帐日期 || b.入帐时间,'yyyy-mm-dd HH24.MI.SS')
between to_date(date2,'yyyy-mm-dd') - 15 and TO_DATE(date2||time2,'YYYY-MM-DDHH24.MI.SS')
) c
where ABS(差额比)<0.1 -- order by 时间差
)
where RK<=1
qiyousyc 2008-04-03
  • 打赏
  • 举报
回复
第一个问题:能不用游标就不要用游标,用游标的效率低,所以游标肯定不行。
按你的b的写法,最好建立位图索引。

第二个问题:一个存储过程与5个存储过程并不一定那个快,按你的现象,应该是一个存储过程快。

200小时才能完成,肯定你的语法有问题,或者表结构有问题,索引、分区等都没有。
实在不行,用最苯的办法,按年将表分成5个表,来分别处理,速度肯定提升很多。
小兽 2008-04-03
  • 打赏
  • 举报
回复
如果你的表是按时间分区的话,分开并行查询当然会快很多倍。
加载更多回复(6)

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧