循环一张大概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时减少计数器。
这样的好处是把统计的时间分散了,而且数据也及时。 缺点是会对性能有些许的影响。
------解决方案--------------------用批量处理语句
------解决方案--------------------创建一张视图,带索引的,然后对这张视图进行操作,性能会好些