日期:2014-05-19  浏览次数:20446 次

|M| SQL查询语句和 ASP.NET处理数据 的效率问题
比如我有一张销售表Sale
现在我要查询出里面的所有UserId==12的记录

因为我的过程里面已经有了
void   DataTable   SaleGetList()
{
      String   sql= "select   *   from   sale ";
      ...
      return   ds.Table[0];
}
然后现在我想要取出UserId==12的记录
我就想要用
方法一:--------------------------------
void   DataTable   GetUserID(ID)
{
      DataTable   dt=SaleGetList();
      DataTable   dt_User=new   DataTable();
      for(int   i=0;i <=dt.rows.count-1;i++)
      {
              这里判断UserId=12时将这记录添加到dt_User中
      }
      return   dt_User;
}
方法二:-----------------------------
void   DataTable   GetUserID(ID)
{
      String   sql= "select   *   from   sale   where   userid= "+id;
      ...
      return   ds.Table[0];
}
---------------------------------
我个人比较喜欢用   方法一;
问:
1:在一个有10000条记录的表中的话方法一;要比方法二慢多少
2:大家会用哪一种方法

------解决方案--------------------
1:客户邮购一本书,那么书店就寄仓库去,然后到了门口再选择.
2:翻仓库清单,选出需要的书,寄給人家.

你说用哪种.
------解决方案--------------------
10000条的话慢的不是很明显..
可是10万,100万,就明显效率低多了...

第一种.费那事干嘛
还是建议用第二种...

------解决方案--------------------
方法一 通过方法GetUserID 实例化了一个SaleGetList对象(在堆上的引用) 获取并返回一个DataSet 其流程相当于: 连接数据库-> 读取全部数据-> 生成DataSet并断开连接-> 讲ds进行筛选然后生成一个新的Table[1]放入数据集-> 最终返回你要的ds(其中包含2个Table)

方法二 新建一个GetUserID方法 直接从数据库读取符合条件的数据 生成数据集 只有你需要的那个Table

所以方法二好,我选方法二

2者的效率...显然

(注:纯属个人意见,有理论错误请指点)
------解决方案--------------------
附: 假如楼主觉得要运用OO的理念的话,可以这样: 定义个readonly的全局的DataSet对象(我没有定义过 不知道能不能)。然后在构造函数中对DataSet赋值(即执行select * from sale的数据写入数据集)
接下来在所有的方法中可以对该对象中的数据进行筛选
------解决方案--------------------
1、不管怎么说,邮寄仓库的做法都是下下策。应该极力避免的。

即使是要仓库的里所有货物的话也应该分期分批的邮购,毕竟运力有限。

2、面向对象也不是这个方式吧。
------解决方案--------------------
即使怎地用方法一的话,也应该用

DataView dv = dt.DefaultView();
dv.RowFilter = "UserID = 12 ";
来过滤,何必自己写循环呢?
------解决方案--------------------
假如楼主觉得要运用OO的理念的话,可以这样: 定义个readonly的全局的DataSet对象


===========

真的是这样的话,那OO也太简单了呀。
------解决方案--------------------

------解决方案--------------------
个人认为是方法二.
------解决方案--------------------
重载你的过程
void DataTable SaleGetList(int id)
{
String sql= "select * from sale where id= "+id;
...
return ds.Table[0];
}

------解决方案--------------------
第二种方法效率高些
楼上
1:客户邮购一本书,那么书店就寄仓库去,然后到了门口再选择.
2:翻仓库清单,选出需要的书,寄給人家.
形容得很贴切啊
------解决方案--------------------
当然是第二种好. 你的第一种方法是重复了数据库的检索功能,且效率大不如数据库. 并且需将数据从数据库中取到web程序的内存中. 会造成 1.web服务器与数据库通讯数据量过大可能会对网络造成阻塞 2.数据库服务器压力增大(需查询大量数据) 3.web服务器压力增大(内存中保存大量数据,并处理) 再者处理时用循环也不是高效的作法。(datatable 有select方法或dataview的rowfilter属性