日期:2014-05-16  浏览次数:20467 次

百万级数据量反应慢问题
现在大概有100w条记录,分散在不同的数据表中,每张表大概几w数据,现在业务从每张表中取出最新的一条记录,发现速度非常慢,大致5s左右。而且开始服务后,然后界面就卡死。请问这个怎么解决呢?

代码如下:

        #region 启动服务按钮
        private void startservice_Click(object sender, EventArgs e)
        {
            this.Enabled = false;          //服务启动后,按钮不可用
            stopservice.Enabled = true;   //停止按钮可用

            dataOperation = new DataOperation();

            sqlconn = dataOperation.getSqlConn();
            sqlconn.Open();

            dataOperation.DataImport(sqlconn);           //将Access数据库数据导入到SQL Server
            dataOperation.CheckException(sqlconn);      //导入过程中,如有异常值,则添加报警日志记录到SQL Server

            timer.Interval = 1000 * 20;            //每隔5分钟进行一次数据导入
            timer.Tick += new EventHandler(OnTimedEvent);
            timer.Enabled = true;
            timer.Start();

            //thread = new Thread(new ThreadStart(threadService));
            //thread.IsBackground = true;      //作为后台线程
            //thread.Start();
        }
        #endregion


       #region 每隔一定时间间隔导入一批数据到SQL Server
        private void OnTimedEvent(object source, EventArgs e)
        {
            dataOperation.DataImport(sqlconn);           //将Access数据库数据导入到SQL Server
            dataOperation.CheckException(sqlconn);      //导入过程中,如有异常值,则添加报警日志记录到SQL Server
        }
        #endregion

------解决方案--------------------
--界面卡死,是CPU占100%了吧?用多线程技术写这段代码
--取最新一条数据,哪条算最新的?某个时间字段,还是表有自增列?不管是什么,给相应字段加索引即可。
------解决方案--------------------
你不应该在UI端中运行这段代码,顶多是UI端的按钮发出一个开始命令,然后由后台WINDOWS服务或JOB判断或接收这个命令进行处理,一切的处理都应该交给服务端及后台服务。多线程的方案仍然会占用你客户端的CPU,无法从根本上解决问题。
另外你的的数据库设计及需求貌似也不合理。
------解决方案--------------------
先在sqlserver优化好你的查询再考虑界面展示
------解决方案------------