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

peachlee 2007-02-28 11:00:55
方法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秒之多阿?
不知道是为什么??
...全文
554 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
peachlee 2007-02-28
  • 打赏
  • 举报
回复
问题已经搞定,因为数据库重新用sql生成,所以把主键丢了,这个过程没有问题,程序也没有问题,谢谢大家
cpp2017 2007-02-28
  • 打赏
  • 举报
回复
dataset需要占用大量服务器内存. 还要从数据库服务器取大量数据到webserver 而存储过程只返回pagesize 条记录给webserver,再说这个存储过程也不怎么好.
hertcloud 2007-02-28
  • 打赏
  • 举报
回复
数据库 中 testid
设置成 索引
北京的雾霾天 2007-02-28
  • 打赏
  • 举报
回复
因为用存储过程取的时候程序要直接从数据库取数据,
而用DataSet的话,它实际上已从数据库取出数据了,相当于本地操作了,所以会快,但它是建立在第一次很慢的基础上的.
peachlee 2007-02-28
  • 打赏
  • 举报
回复
hbxtlhx(平民百姓)
你说的有道理,但是为什么我直接取所有的数据集,再去dataset10条,要比储存过程取10条填充,还要快得多
cpp2017 2007-02-28
  • 打赏
  • 举报
回复
排序是很消耗资源的
peachlee 2007-02-28
  • 打赏
  • 举报
回复
select top 10 * from [testDataServer] where [testid]>(select max([testid]) from (select top 9980 [testid] from [testDataServer] where 1=1 order by [testid] asc) as tblTmp) and 1=1 order by [testid] asc
我打印sql后发现
order by [testid] asc 使我的过程非常慢,请高手指点是不是这里有问题
thinkingforever 2007-02-28
  • 打赏
  • 举报
回复
先把你的存储过程执行一下,看用了多长的时间?这个存储过程很通用,但不一定高效
cpp2017 2007-02-28
  • 打赏
  • 举报
回复
一个是动态sql.还要处理分页,另一个是直接一个表查询.
hertcloud 2007-02-28
  • 打赏
  • 举报
回复
存储过程分页 肯定会高于
dataset完全读取分页的

这个 可能是你代码问题

也可能是因为你的测试数据虽然有100w条 但是简单
在内存中填充的时间短 而且你又有足够的内存 内存中操作当然是快.
还有就是你的
SuTao.CommonTools.DbHelperSQL.Query这个方法有问题..
建议你直接使用
SqlDataReader 直接获取数据 这样的测试才是准确的

cpp2017 2007-02-28
  • 打赏
  • 举报
回复
j9988 2007-02-28
  • 打赏
  • 举报
回复
这算那门子高效存储过程.只能说是通用,但绝不高效.
这个过程因为要通用,所以很多地方画蛇添足.
北京的雾霾天 2007-02-28
  • 打赏
  • 举报
回复
注意啊:
adapter.Fill(ds1, 9990, 10, "0");
-------
这句代码实现的不是真正的分页查询,而是将数据一次性取出后再分的页,不是按分页的数据取出了刚好多的记录.
chxuxu 2007-02-28
  • 打赏
  • 举报
回复
ding

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧