【急急急】大数据查询,进度条,假死,多线程

wzh2021 2013-05-25 10:11:50
for ll_i=1 to dw_phoneno_oftelphone.rowcount() //手机号码

ls_phoneno = dw_phoneno_oftelphone.object.phoneno[ll_i]

for ll_j=1 to dw_xq.rowcount() //小区编号
yield()
//进度条
if isValid(w_prostep) then w_prostep.f_step() //
w_prostep.SetRedraw(TRUE)

ll_xqid = dw_xq.object.id[ll_j]
ls_xqbh = dw_xq.object.xqbh[ll_j]
ls_xqmc = dw_xq.object.xqmc[ll_j]
//查询某月、某手机号、在某小区的通话次数
SELECT sum(js) into :ll_hz_count FROM p_phonecall
WHERE ( p_phonecall.billing_nbr = :ls_phoneno) AND ( p_phonecall.ny = :ls_ny ) and (cell_id=:ls_xqbh) ;
if isnull(ll_hz_count) then ll_hz_count=0

IF ib_cancel = TRUE THEN goto rett

next
//查询某月、某手机号的通话次数总和
SELECT sum(js) into :ll_all_count FROM p_phonecall
WHERE ( p_phonecall.billing_nbr = :ls_phoneno) AND ( p_phonecall.ny = :ls_ny ) ;
if isnull(ll_all_count) then ll_all_count=0

next

p_phonecall的表结构很简单,就5列。但是这个表的数据量很大,有6千万--1亿条记录左右!!
billing_nbr--手机号
ny--所属月份
cell_id--小区编号
js-计数(全部为1)
duration--通话时长(单位秒)


现在每次到了select的时候 程序就假死了

怎么解决啊

谢谢大家了,很着急啊 !
...全文
1367 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
PB菜鸟 2013-11-14
  • 打赏
  • 举报
回复
汗,原来是5月份的贴子了。。。
PB菜鸟 2013-11-14
  • 打赏
  • 举报
回复
那么大数据量还 嵌套for next 。 不卡死才怪。 你想要什么数据,如果只是统计某个手机 某个小区的某月的次数和该手机某月的总次数,可以直接通过sql语句来实现的,肯定比你循环快多了。如果sql查询慢 是需要加索引。 如果是sql 2005以上版本可以试试在所属月份上建立分区,每个月建立一个分区,因为你的查询是按月为单位的,这样数据量就会减少N多。
wzh2021 2013-11-13
  • 打赏
  • 举报
回复
都不管用的 你们想的 我都试过了 都会卡死的 每个月都有6000万条数据左右,占用空间2-3个G 我现在每个月建了一个表,并且建立了索引, xxxx_yyyymm格式的表名 所有的查询通过存储过程实现了:建立临时表,对临时表创建索引,再进行count或者sum,快多了 使用了多线程控制进度条,主程序也不会假死了 谢谢大家!
wxliangzyt 2013-11-02
  • 打赏
  • 举报
回复
大数据查询,就不该用 for to select next group by 1下,肯定可以解决 同意楼上,
dyf0130 2013-05-27
  • 打赏
  • 举报
回复
大数据查询,就不该用 for to select next group by 1下,肯定可以解决
WorldMobile 2013-05-25
  • 打赏
  • 举报
回复
yield() //进度条 if isValid(w_prostep) then w_prostep.f_step() // yield() 在进度条后面再加一个yield试试,然后看一下sql执行的时间,如果时间过长,也一样假死
WorldMobile 2013-05-25
  • 打赏
  • 举报
回复
首先执行一次 SELECT sum(js) into :ll_all_count FROM p_phonecall WHERE ( p_phonecall.billing_nbr = :ls_phoneno) AND ( p_phonecall.ny = :ls_ny ) ; 把变量换成值,然后单独执行一下sql,看一下需要多长时间,如果在10秒以上,需要建立索引,如果只是在几秒,应该还可以接爱,再看一下你的循环,执行多少次,如果执行在几十次以上,建议你不要用sql写了,用个数据窗口,一次把要查询的数据全查出来,然后用find进行查找,这样速度就快了
wzh2021 2013-05-25
  • 打赏
  • 举报
回复
引用 1 楼 wag_enu 的回复:
要达到什么效果 ? 在运行耗时较长的查询的时候进度条保持动作吗?
是的
wag_enu 2013-05-25
  • 打赏
  • 举报
回复
要达到什么效果 ? 在运行耗时较长的查询的时候进度条保持动作吗?

752

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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