论坛首页 综合技术论坛

存储过程真的好快!

浏览 36307 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2008-04-22  
同事有个排名的业务,因为只有流水表,所以排名只能用到group by

表结构
A{
v_id number;
v_num number;
}
数据
v_id v_num
1    2
2    20
5    4
1    -1
.....
要求v_id的总分排名
v_id总分为:count=select sum(v_num) from a where v_id=?

排名为:select count(1) from (select sum(v_num) num from a group by v_id) where num>count


就这样语句用sql是很慢,而在存储过程中速度是sql的1/10
   发表时间:2008-04-22  
后头有你叫的时候。大量业务写入存储过程,对调试和修改均极为不方便。我觉得你这种业务用缓存的方式解决最好。处理一次,缓存起来。没了查询数据库,不是更快。等缓存失效了,才需要二次运算。缓存时限可以根据你的需求定,哪怕有1分钟,对高并发的访问都是可以大大缓解的。
0 请登录后投票
   发表时间:2008-04-22  
用下面这个SQL可以一次检出所有的v_id的总分排名

SELECT 
    ROW_NUMBER() OVER(ORDER BY X.NUM) AS 排名
    , V_ID
FROM 
(
    SELECT
        SUM(V_NUM) NUM,
        V_ID
    FROM A
    GROUP BY V_ID
) X
0 请登录后投票
   发表时间:2008-04-22  
魔力猫咪 写道
后头有你叫的时候。大量业务写入存储过程,对调试和修改均极为不方便。我觉得你这种业务用缓存的方式解决最好。处理一次,缓存起来。没了查询数据库,不是更快。等缓存失效了,才需要二次运算。缓存时限可以根据你的需求定,哪怕有1分钟,对高并发的访问都是可以大大缓解的。


汽车厂的员工可不少呀,发到内存里是不是太浪费了呀!
机器只有2G
0 请登录后投票
   发表时间:2008-04-22  
我是说你把结果缓存起来。不是说要你把所有的员工缓存起来。ASP.NET和JavaEE都有页面缓存,生成这么一个页面的缓存用不了多大地方。
如果没页面缓存的话,把查询的结果集缓存应该也不需要很大的地方。
0 请登录后投票
   发表时间:2008-04-22  
zb1015 写道
魔力猫咪 写道
后头有你叫的时候。大量业务写入存储过程,对调试和修改均极为不方便。我觉得你这种业务用缓存的方式解决最好。处理一次,缓存起来。没了查询数据库,不是更快。等缓存失效了,才需要二次运算。缓存时限可以根据你的需求定,哪怕有1分钟,对高并发的访问都是可以大大缓解的。


汽车厂的员工可不少呀,发到内存里是不是太浪费了呀!
机器只有2G

谁让你把select *缓存,人家是让你把count缓存……
0 请登录后投票
   发表时间:2008-04-23  
速度不是企业应用的唯一且最要紧的诉求
0 请登录后投票
   发表时间:2008-04-25  
刑天战士 写道
zb1015 写道
魔力猫咪 写道
后头有你叫的时候。大量业务写入存储过程,对调试和修改均极为不方便。我觉得你这种业务用缓存的方式解决最好。处理一次,缓存起来。没了查询数据库,不是更快。等缓存失效了,才需要二次运算。缓存时限可以根据你的需求定,哪怕有1分钟,对高并发的访问都是可以大大缓解的。


汽车厂的员工可不少呀,发到内存里是不是太浪费了呀!
机器只有2G

谁让你把select *缓存,人家是让你把count缓存……


那排名怎么查呢?
0 请登录后投票
   发表时间:2008-04-25  
Joo 写道
速度不是企业应用的唯一且最要紧的诉求

他们答题是的指标的,一个月一人次答5000次,而且是手机上wap方式
0 请登录后投票
   发表时间:2008-04-28  
zb1015 写道
刑天战士 写道
zb1015 写道
魔力猫咪 写道
后头有你叫的时候。大量业务写入存储过程,对调试和修改均极为不方便。我觉得你这种业务用缓存的方式解决最好。处理一次,缓存起来。没了查询数据库,不是更快。等缓存失效了,才需要二次运算。缓存时限可以根据你的需求定,哪怕有1分钟,对高并发的访问都是可以大大缓解的。


汽车厂的员工可不少呀,发到内存里是不是太浪费了呀!
机器只有2G

谁让你把select *缓存,人家是让你把count缓存……


那排名怎么查呢?


select vid from A group by vid order by sum(v_num)
把这个查询结果放到一个int数组里缓存起来,排名就是传入的vid在数组中的index+1
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics