日期:2014-05-18  浏览次数:20545 次

循环一张大概20万条记录的表,并发数高
要统计一个数据,需要循环一张表大概20万条记录,用存储过程实现。

采用游标方式好还是临时表的方式好呐?   并且是这个存储过程是在线的时候用job一个小时执行一次的,也就是说那个20万条记录的表并发请求量大。


------解决方案--------------------
update c
set col = t.col
from c,(select id , sum(col) col from b group by id) t
where c.id = c.id

和A表无关?



insert into c select id , sum(col) col from b group by id
------解决方案--------------------
或加上A的限制

update c
set col = t.col
from c, (select a.id , t.sum from a, (select id , sum(col) col from b group by id) t where a.id = t.id) m
where c.id = m.id


------解决方案--------------------
你能不能给点具体的数据,看文字头疼.

这是名次的处理办法.

表jh03有下列数据:
name score
aa  99
bb  56
cc  56
dd  77
ee  78
ff  76
gg  78
ff  50

1. 名次生成方式1,Score重复时合并名次
SELECT * , Place=(SELECT COUNT(DISTINCT Score) FROM jh03 WHERE Score > = a.Score)
FROM jh03 a
ORDER BY Place
结果
Name Score Place
---------------- ----------------- -----------
aa 99.00 1
ee 78.00 2
gg 78.00 2
dd 77.00 3
ff 76.00 4
bb 56.00 5
cc 56.00 5
ff 50.00 6

2. 名次生成方式2 , Score重复时保留名次空缺
SELECT * , Place=(SELECT COUNT(Score) FROM jh03 WHERE Score > a.Score) + 1
FROM jh03 a
ORDER BY Place
结果
Name Score Place
--------------- ----------------- -----------
aa 99.00 1
ee 78.00 2
gg 78.00 2
dd 77.00 4
ff 76.00 5
bb 56.00 6
cc 56.00 6
ff 50.00 8
------解决方案--------------------
select a.name , t.cnt from a
(
select name , count(*) cnt from b where isTrue = 1
) t
where a.name = t.name

然后使用我上面给的名次计算办法.
------解决方案--------------------
似乎不需要游标,但是你说的太不确切了。

------解决方案--------------------
看不出来你所谓的表C的作用.
实际上,每次Truncate table然后重新
Insert into C
select * from
(select name,count(case when istrue=1 then 1 end) t from b
group by name)
x
order by x.t
或许会效率更高



------解决方案--------------------
那么如果更新后根本就没有某项的统计数,如何更新排名?
------解决方案--------------------
就是排程嘛
建議用臨時表好一點
------解决方案--------------------
能不能考虑这样做呢,在B表中增加insert update触发器,在插入或者修改状态为True时对C表增加计数,删除或者状态改为false时减少计数器。
这样的好处是把统计的时间分散了,而且数据也及时。 缺点是会对性能有些许的影响。
------解决方案--------------------
用批量处理语句
------解决方案--------------------
创建一张视图,带索引的,然后对这张视图进行操作,性能会好些