刚才在ms-sql server版问,有人提议到C#版问...
现在把大量要查询的sql语句(几千或者几万条)存放在一个数组中,然后对每一条sql语句查询,得到的结果存放在一个dataset中,那么如何提高效率呢?我的查询代码如下:DataSet da = new DataSet();        //定义一个dataset,保存查询结果
SqlDataAdapter colAdapter = new SqlDataAdapter();
SqlConnection sqlconn = new SqlConnection(ConfigurationManager.AppSettings["connectionString"].ToString());        //连接字符串在配置文件
while(index < CountNum)//查询没有结束
{
    colAdapter.SelectCommand =  new SqlCommand(query[index], sqlconn);    //query中存放要查询的sql语句
    colAdapter.Fill(da, hashList[index]);    //设置表名
                 index++;
}
我测试的时候发现查询很慢,机器几乎没有反应了试过用多线程做,不过比单线程还要慢。
太惨了,只有10分可用分了...想加都加不了了。

解决方案 »

  1.   

    DataSet da = new DataSet();        //定义一个dataset,保存查询结果
    SqlDataAdapter colAdapter = new SqlDataAdapter();
    SqlConnection sqlconn = new SqlConnection(ConfigurationManager.AppSettings["connectionString"].ToString());        //连接字符串在配置文件
    colAdapter.SelectCommand =  new SqlCommand(query[0], sqlconn);    
    while(index < CountNum)//查询没有结束
    {
          colAdapter.Fill(da, hashList[index]);    //设置表名
          index++;
          colAdapter.SelectCommand.CommandText =  query[index]    //query中存放要查询的sql语句
      }              
    不过,即使这么改过了,我估计还是慢,你的瓶颈恐怕是反复从数据库中查询导致的。怎么会有这么大的查询量呢?
      

  2.   

    结果是由所有sql语句查询结果组成的。我就是在查询完毕后再分析数据的,之前我没有把查询语句存到数组中,而是在运行的时候临时产生出来,现在这样处理过后效率好了一点点,不过还是慢得很。
      

  3.   

    如果你查询的结果都是一样的表结构的话,我建议你还是在数据库中完成这些事。在SQL语句中union拼接
      

  4.   

    建议LZ把SQL语句写在SQL服务器的存储过程当中,这样查询事先就编译过了,速度也就快起来了
      

  5.   

    我也想过用存储过程的,不过因为select语句中where条件每一次循环之后都会增加的,也就是说where col1='a' and col2='b'...每一次coln都会增加的,动态变化的,所以没有办法当存储过程
      

  6.   

    你这样的design,不可能有什么效率的:一次执行几千或者几万条sql语句,结果都存放在一个数组中,这样都有可能造成outof memory的。
    要么把这些查询放在存储过程做,然后读取结果;要么每次执行一个小的查询,一个或几个sql语句。
      

  7.   

    你说的out-of-memory是不太可能会出现的。因为我返回的结果是一个整数而已。即使是一千万条结果也只是1000w*4bye而已,况且我的数据量不可能有那么多
    嗯。下午要尝试一下用函数做,存储过程传递参数实在不方便或者一次执行100个sql语句。
      

  8.   

    我以前也遇到过类似的问题。 可一考虑在内存允许的情况下,把数据库中的记录分批读出(select *),然后再筛选符合条件的记录并保存之;释放内存;重复这个操作。
      

  9.   

    修正一下,分批读出数据的时候,不需要select *, 只读和筛选条件相关的那些列就可以了。
      

  10.   

    你这些数据挖掘能不能用proceudre来实现,这样,就不用.net去做这种大量数据的工作了,
    就像ERP中的MRP一样,要是在客户端算,会死人的,都是再数据库上算,然后取结果的.