在说明问题之前,先提醒下高手们,我只是个新手,做项目也才每到一年的,所以对我这些“所谓的优化”,如果我做得不对,请批评,别笑话小弟     最近在做一个市的绩效考核系统,其中有一个页面需要很复杂的业务处理逻辑(比如:首先要查数据库领导,然后查该领导有关的调查问卷,再统计问卷的选项,然后按选项个数分别乘以权重,再……),一开始同组的成员写了个方法,就是没做一点优化,查到哪算到哪那种,结果从点击到显示结果用了近40秒钟
然后我试着做了些优化:
1.把查出来的表持久化(不知道.net内部是否做了,但我自己做了一遍),也就是把该查询用得比较频繁的两个表的数据放在了datatable中,然后从内存表读数据,结果效率貌似没什么区别,只是时间变化稳定了一些
2.把以前那小组成员写的一些不是用存储过程那些语句,都用了存储过程重写,结果也只是提高了时间方面的稳定性
3.用了多线程,每一条数据都用了一个线程来单独处理。
也就是在用这多线程的时候发现了如下问题:首先就是其中一次测试用了3个线程来处理一条数据(因为这条数据基本上是平均分为三个过程统计的),一次要处理10条数据,每个线程必须占用一个连接,在这个测试中,线程抛连接超时的异常了,即使我改了服务器的连接池数量(min100,max1000)也没用,这个问题我搞不太清楚,希望高手指点一下然后我还是按一开始的一个线程处理一条数据,结果效率只是提高了没到两倍(按我自己的理解,10个线程来执行,虽说不可能10倍,但快5,6倍应该是正常的啊~),这点我不太理解,希望高手指教第三次测试,我把每次显示的结果(即统计数据的条数,也就对应了线程的个数,比如一条数据是一个线程)做了下调整,得出的数据居然是这样的:
一条数据:1.9秒,两条数据,3.7秒,4条数据:7秒,基本上按倍率递增的。
发现这个问题我觉得很惊讶,不是多线程吗?那这样跟单线程还有什么区别?这三个问题,都想请教下高手帮忙解决,还有就是优化这个统计查询上的一些建议,谢谢了

解决方案 »

  1.   


    同步是什么意思?搞不太清,关键代码如下
    for (int n = 0; n < leaderCountNO; n++)
            {
                 thread = new Thread(new ThreadStart(LSThread.run));
                 thread.Priority = ThreadPriority.AboveNormal;
                 thread.Start();
            }
    线程中lock的代码,这些都是瞬间完成的过程,应该不会有问题吧?
    lock (lockThis)
                {
                    //得到一个领导
                    leader = examinleader[count];
                    //计数加1           
                    count = count + 1;
                    //新建数据行                
                    dr = DT.NewRow();
                    //往数据行固定字段填充数据
                    dr["num"] = count;
                    
                }
      

  2.   

    lock()内的代码,多个线程并发的时候,实际上别的线程在等待。相当于“独木桥”
      

  3.   

    我知道,但是这个阶段超级短,你也看到了,唯一一个运算就是count++,其他的根本就是直接赋值的,这不可能会导致它跟单线程得到类似的结果把
      

  4.   

    应该是数据库查询的时候锁定表了,所以再开100个线程都没用的,不知道是什么数据库,如果是sql server,在每个查询表上加上with (nolock)看看,例如:
    select * from table with (nolock) where 1<>0
      

  5.   

    優化數據庫Index,優化表,優化存儲過程才是王道... ... 
    明顯瓶頸在這些地方
      

  6.   


    ~本以为可以解决问题了~一试,发现一模一样~
    你说的问题是否跟事务有关呢?我也学过hibernate中的事务,我这个项目貌似没有事务这个概念,所有的都是直接写sql语句的~
    我也不太清楚~多谢指教了~
      

  7.   

    多用存储过程和SQL语句优化。