业务需求如下
找出某个月的订单 接近30万条记录
从中随机抽取1%条我现在是把该月的订单保存到DataTable中
然后把DataTable保存ViewState1中-----为了在条件没变的时候 不要再搜索数据库 然后随机从DataTable中找出1%条保存ViewState2-----为了在Gridview分页的时候 不在随机从DataTable抽1%但现在第一次点击搜索的时候还可以 不会太慢
但第二次点击分页或点下载的时候就... ....问题1:  是不是ViewState转换成DataTable 太消耗性能了
问题2:  有其他好的建议吗

解决方案 »

  1.   

    不要使用ViewState保存海量数据,因为该数据会被压缩编码到页面上,而第二次postback回来时会原封不动的返回给服务器重构。
    通常这种数据可以存储在Session中,这种方法会牺牲服务器内存,有1000个用户访问服务器就废了。
    好的解决方案是不存储,直接通过存储过程进行分页小数据量提取。
      

  2.   

    你这个应该建数据仓库了,ETL操作让数据库去做
      

  3.   

    viewstate存任何东西都要先反复论证,只有绝对必要才使用viewstate。你的viewstate只应该保存一条记录的id,不是记录本身,而仅仅是记录的主键。许多时候从数据库中(依据逐渐查询)读取一条记录代价要比在viewstate中保存整个记录的代价小多了。
      

  4.   

    依据逐渐查询  -->  依据主键查询至于说将30万条记录保存在DataTable?我就更不理解了。根本不应该将30万条记录读入内存,更别说还要保存了。
      

  5.   

    学asp.net缓存可以从msdn开始,参考:http://msdn.microsoft.com/zh-cn/library/aa478965.aspx
    其中,VaryByCustom是最需要灵活运用的技术。
      

  6.   

    关于数据如何缓存,还是可以看几年前Scott Mitchell的那个老的asp.net2.0入门教程:http://www.wewill.cn/n313c13.aspx
      

  7.   

    可以先用sql选出1%的数据select * from (select *, row_number() over(order by newid()) as rownum from 订单表) a where rownum-1<=(select count(*)/100 from 订单表)
      

  8.   

    是不是ViewState转换成DataTable 太消耗性能了
    这个你该看下页面生命周期。就明白啥是viewstate了。
    你只应该缓存已经查询过的一页、一页数据。
      

  9.   


    用top 1 percent还方便点呢
    只是我抽出来的数据还要和其他表(订单状态)中的数据
      

  10.   

    30万条记录保存到内存,消耗资源
    还是分页读取数据
    需要可使用缓存依赖SqlCacheDependency
    SELECT TOP 1 PERCENT 
    随机newid
      

  11.   

    ViewState 使你的页面体积增大;SQL 将结果集分页
      

  12.   

    分页 + 缓存 。。尽量减少 ViewState的使用..
      

  13.   

    明显的OLAP应用.
    针对销售进行在线联机分析处理.使用SSIS进行ETL导入到DataWare House,用SSAS建立CUBE,维度对DW中的资料进行多维度分析.
    最后可以使用SSRS或者ASP.NET/WINFORM来呈现.
      

  14.   


    嘿嘿,.net版里面好像懂BI的很少,短短一句话,把微软的BI的三驾马车全带进去了,嗯,说得很好
      

  15.   

    这么大的数据。不应该全部选择出来放在datatable中。应该select top 10 * from table where id between ...