免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1620 | 回复: 4
打印 上一主题 下一主题

请教一个大型查询的问题!! 急!明天要交货! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-09-15 17:05 |只看该作者 |倒序浏览
onstat -g ses 521  输出:
Informix Dynamic Server 2000 Version 9.21.FC7     -- On-Line -- Up 11:04:55 -- 4
59096 Kbytes

session                                      #RSAM    total      used
id       user     tty      pid      hostname threads  memory     memory
521      acct     -        28368    v22_bcv  2        98304      93384

tid      name     rstcb            flags    curstk   status
552      sqlexec  c00000005b1940a8 B--PR--  256288   c00000005b1940a8sleeping(Fo
rever)
553      scan_1.0 c00000005b190068 -------  263728   c00000005b190068sleeping(se
cs: 2)

Memory pools    count 1
name         class addr             totalsize  freesize   #allocfrag #freefrag
521          V     c00000005cf8e040 98304      4920       194        4

name           free       used           name           free       used
overhead       0          3256           mtmisc         0          72
resident       0          104            scb            0          216
opentable      0          6192           filetable      0          1968
log            0          4336           temprec        0          2544
keys           0          264            ralloc         0          31008
gentcb         0          2328           ostcb          0          3416
sqscb          0          17384          sql            0          72
rdahead        0          256            xchg_desc      0          1208
xchg_port      0          1144           xchg_packet    0          408
xchg_group     0          104            xchg_priv      0          288
hashfiletab    0          1104           osenv          0          2752
buft_buffer    0          2168           sqtcb          0          7672
fragman        0          1736           shmblklist     0          1248
sapi           0          64

Sess  SQL            Current            Iso Lock       SQL  ISAM F.E.
Id    Stmt type      Database           Lvl Mode       ERR  ERR  Vers
521   SELECT         acctdb             DR  Not Wait   0    0    9.03

Current statement name : unlcur

Current SQL statement :
  SELECT a.dtl_mon, b.flag,  SUM (CASE      WHEN ( a.dr_cr_flag = '1' )
    THEN a.amount     WHEN ( a.dr_cr_flag = '2' )      THEN -a.amount     ELSE
    0     END) FROM t_sdm_dtl a , t_acc b WHERE a.acc =  b.acc group by
    a.dtl_mon, b.flag

Last parsed SQL statement :
  SELECT a.dtl_mon, b.flag,  SUM (CASE      WHEN ( a.dr_cr_flag = '1' )
    THEN a.amount     WHEN ( a.dr_cr_flag = '2' )      THEN -a.amount     ELSE
    0     END) FROM t_sdm_dtl a , t_acc b WHERE a.acc =  b.acc group by
    a.dtl_mon, b.flag

1024 byte(s) of memory is allocated from the sscpool


表t_sdm_dtl 2000万条  表t_acc  50万条
目的:统计每个月存款账户借贷发生总额
执行: nohup  sum.sh

为什么老是sleeping, 跑了5个小时, 没动静, 明天要交货!

sum.sh如下

isql  << !
database acctdb;
SET PDQPRIORITY HIGH;
set isolation to dirty read;
unload to sum.txt SELECT a.dtl_mon, b.flag,
        SUM (CASE
           WHEN ( a.dr_cr_flag = '1' )
                THEN a.amount
           WHEN ( a.dr_cr_flag = '2' )
                THEN -a.amount
           ELSE 0
           END)
FROM t_sdm_dtl a , t_acc b
WHERE a.acc =  b.acc
group by a.dtl_mon, b.flag;
!

论坛徽章:
0
2 [报告]
发表于 2004-09-15 17:30 |只看该作者

请教一个大型查询的问题!! 急!明天要交货!

a,b表的acc字段都要建索引.

跑5个小时,还不如花1个小时写程序实现,不要什么都指望用SQL。

曾经测试过带很多条件的SUM,用游标在ESQL/C中Fetch一条判断、累加比用SQL的SUM函数+where子句要快很多。

论坛徽章:
0
3 [报告]
发表于 2004-09-15 17:43 |只看该作者

请教一个大型查询的问题!! 急!明天要交货!

谢谢zzjijun

a,b表的acc字段都有建索引
是不是要将小表t_acc放在前头?

tid name rstcb flags curstk status
552 sqlexec c00000005b1940a8 B--PR-- 256288 c00000005b1940a8sleeping(Forever)
553 scan_1.0 c00000005b190068 ------- 263728 c00000005b190068sleeping(secs: 2)


为什么老是sleeping

论坛徽章:
0
4 [报告]
发表于 2004-09-15 18:46 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2004-09-15 21:03 |只看该作者

请教一个大型查询的问题!! 急!明天要交货!

unload to sum1.txt SELECT a.dtl_mon, b.flag, SUM (a.amount)
FROM t_sdm_dtl a , t_acc b
WHERE a.dr_cr_flag = '1' and a.acc = b.acc
group by a.dtl_mon, b.flag;
unload to sum2.txt SELECT a.dtl_mon, b.flag, -SUM (a.amount)
FROM t_sdm_dtl a , t_acc b
WHERE a.dr_cr_flag = '2' and a.acc = b.acc
group by a.dtl_mon, b.flag;

试试这样会不会好些吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP