首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

SqlDataAdapter.Fill()比高效的存储过程效率还高,郁闷中?(请)

2012-03-21 
SqlDataAdapter.Fill()比高效的存储过程效率还高,郁闷中??(请高手指点)方法1:SqlDataAdapter的分页stringt

SqlDataAdapter.Fill()比高效的存储过程效率还高,郁闷中??(请高手指点)
方法1:   SqlDataAdapter的分页
string         temp_sqlstr   =   "select   *   from   testDataServer ";
                  SqlDataAdapter   adapter   =   new   SqlDataAdapter(temp_sqlstr,   pubFunction.P_strConn);

                DataSet   ds1   =   new   DataSet();

                long   datestart   =   DateTime.Now.Ticks;

                Response.Write( "datestart     "   +   datestart.ToString()   +   " <br> ");

                adapter.Fill(ds1,   9990,   10,   "0 ");


                long   dateEnd   =   DateTime.Now.Ticks;
                long   dIn   =   dateEnd   -   datestart;
                Response.Write( "dateEnd     "   +   dateEnd.ToString());
                Response.Write( " <br> "   +   dIn.ToString()   +   " <br> ");
                Response.Write( "打印数据: ");
             
                for   (int   j   =   0;   j   <   ds1.Tables[0].Rows.Count;   j++)
                {
                        Response.Write( " <br> "   +   ds1.Tables[0].Rows[j][0].ToString());
                }
    方法2:   网上比较号称比较高效的分页过程
存储过程:
CREATE     PROCEDURE   litao_GetRecordByPage
        @tblName             varchar(255),               --   表名
        @fldName             varchar(255),               --   主键/排序   字段名
        @PageSize           int   =   10,                       --   页尺寸
        @PageIndex         int   =   1,                         --   页码
        @IsReCount         bit   =   0,                         --   返回记录总数,   非   0   值则返回
        @OrderType         bit   =   0,                         --   设置排序类型,   非   0   值则降序
        @strWhere           varchar(1000)   =   ' '     --   查询条件   (注意:   不要加   where)
AS

declare   @strSQL       varchar(6000)               --   主语句


declare   @strTmp       varchar(6100)                 --   临时变量
declare   @strOrder   varchar(400)                 --   排序类型
--print   @strWhere
if   @OrderType   !=   0
begin
        set   @strTmp   =   ' <(select   min '
        set   @strOrder   =   '   order   by   [ '   +   @fldName   + ']   desc '
end
else
begin
        set   @strTmp   =   '> (select   max '
        set   @strOrder   =   '   order   by   [ '   +   @fldName   + ']   asc '
end

set   @strSQL   =   'select   top   '   +   str(@PageSize)   +   '   *   from   [ '
        +   @tblName   +   ']   where   [ '   +   @fldName   +   '] '   +   @strTmp   +   '([ '
        +   @fldName   +   '])   from   (select   top   '   +   str((@PageIndex-1)*@PageSize)   +   '   [ '
        +   @fldName   +   ']   from   [ '   +   @tblName   +   '] '   +   @strOrder   +   ')   as   tblTmp) '
        +   @strOrder

if   @strWhere   !=   ' '
        set   @strSQL   =   'select   top   '   +   str(@PageSize)   +   '   *   from   [ '
                +   @tblName   +   ']   where   [ '   +   @fldName   +   '] '   +   @strTmp   +   '([ '
                +   @fldName   +   '])   from   (select   top   '   +   str((@PageIndex-1)*@PageSize)   +   '   [ '
                +   @fldName   +   ']   from   [ '   +   @tblName   +   ']   where   '   +   @strWhere   +   '   '
                +   @strOrder   +   ')   as   tblTmp)   and   '   +   @strWhere   +   '   '   +   @strOrder

if   @PageIndex   =   1
begin
        set   @strTmp   = ' '
        if   @strWhere   !=   ' '
                set   @strTmp   =   '   where   '   +   @strWhere

        set   @strSQL   =   'select   top   '   +   str(@PageSize)   +   '   *   from   [ '
                +   @tblName   +   '] '   +   @strTmp   +   '   '   +   @strOrder
end
print   @strWhere
if   @IsReCount   !=   0


        set   @strSQL   =   'select   count(*)   as   Total   from   [ '   +   @tblName   +   '] '+ '   where   '   +   @strWhere
print   @strSQL
exec   (@strSQL)

程序:

      string   sql   =   "exec   litao_GetRecordByPage   @tblName= 'testDataServer '   ,   @fldName= 'testid '   ,   @PageSize=10,@PageIndex=999,   @IsReCount=0,@OrderType=0,@strWhere= '1=1 ' ";
        long   datestart   =   DateTime.Now.Ticks;
        Response.Write( "datestart     "   +   datestart.ToString()   +   " <br> ");
        DataSet   ds1   =   SuTao.CommonTools.DbHelperSQL.Query(sql);

        long   dateEnd   =   DateTime.Now.Ticks;
        long   dIn   =   dateEnd   -   datestart;

        Response.Write( "dateEnd       "   +   dateEnd.ToString());
        Response.Write( " <br> "   +   dIn.ToString()   +   " <br> ");
        Response.Write( "打印数据: ");

        for   (int   j   =   0;   j   <   ds1.Tables[0].Rows.Count;   j++)
        {
                Response.Write( " <br> "   +   ds1.Tables[0].Rows[j][0].ToString());
        }

以我的100万条数据为例。
SqlDataAdapter.Fill()为1秒,而后者 '号称高效的过程 '用了7秒之多阿?
不知道是为什么??

[解决办法]
注意啊:
adapter.Fill(ds1, 9990, 10, "0 ");
-------
这句代码实现的不是真正的分页查询,而是将数据一次性取出后再分的页,不是按分页的数据取出了刚好多的记录.
[解决办法]
一个是动态sql.还要处理分页,另一个是直接一个表查询.
[解决办法]
先把你的存储过程执行一下,看用了多长的时间?这个存储过程很通用,但不一定高效
[解决办法]
排序是很消耗资源的
[解决办法]
因为用存储过程取的时候程序要直接从数据库取数据,
而用DataSet的话,它实际上已从数据库取出数据了,相当于本地操作了,所以会快,但它是建立在第一次很慢的基础上的.
[解决办法]
数据库 中 testid
设置成 索引

[解决办法]
dataset需要占用大量服务器内存.还要从数据库服务器取大量数据到webserver而存储过程只返回pagesize 条记录给webserver,再说这个存储过程也不怎么好.

热点排行