方法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() + "
");
adapter.Fill(ds1, 9990, 10, "0");
long dateEnd = DateTime.Now.Ticks;
long dIn = dateEnd - datestart;
Response.Write("dateEnd " + dateEnd.ToString());
Response.Write("
" + dIn.ToString() + "
");
Response.Write("打印数据:");
for (int j = 0; j < ds1.Tables[0].Rows.Count; j++)
{
Response.Write("
" + 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() + "
");
DataSet ds1 = SuTao.CommonTools.DbHelperSQL.Query(sql);
long dateEnd = DateTime.Now.Ticks;
long dIn = dateEnd - datestart;
Response.Write("dateEnd " + dateEnd.ToString());
Response.Write("
" + dIn.ToString() + "
");
Response.Write("打印数据:");
for (int j = 0; j < ds1.Tables[0].Rows.Count; j++)
{
Response.Write("
" + ds1.Tables[0].Rows[j][0].ToString());
}
以我的100万条数据为例。
SqlDataAdapter.Fill()为1秒,而后者'号称高效的过程'用了7秒之多阿?
不知道是为什么??
14 个解决方案
注意啊:
adapter.Fill(ds1, 9990, 10, "0");
-------
这句代码实现的不是真正的分页查询,而是将数据一次性取出后再分的页,不是按分页的数据取出了刚好多的记录.
这算那门子高效存储过程.只能说是通用,但绝不高效.
这个过程因为要通用,所以很多地方画蛇添足.
存储过程分页 肯定会高于
dataset完全读取分页的
这个 可能是你代码问题
也可能是因为你的测试数据虽然有100w条 但是简单
在内存中填充的时间短 而且你又有足够的内存 内存中操作当然是快.
还有就是你的
SuTao.CommonTools.DbHelperSQL.Query这个方法有问题..
建议你直接使用
SqlDataReader 直接获取数据 这样的测试才是准确的
一个是动态sql.还要处理分页,另一个是直接一个表查询.
先把你的存储过程执行一下,看用了多长的时间?这个存储过程很通用,但不一定高效
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 使我的过程非常慢,请高手指点是不是这里有问题
hbxtlhx(平民百姓)
你说的有道理,但是为什么我直接取所有的数据集,再去dataset10条,要比储存过程取10条填充,还要快得多
因为用存储过程取的时候程序要直接从数据库取数据,
而用DataSet的话,它实际上已从数据库取出数据了,相当于本地操作了,所以会快,但它是建立在第一次很慢的基础上的.
dataset需要占用大量服务器内存.
还要从数据库服务器取大量数据到webserver
而存储过程只返回pagesize 条记录给webserver,再说这个存储过程也不怎么好.
问题已经搞定,因为数据库重新用sql生成,所以把主键丢了,这个过程没有问题,程序也没有问题,谢谢大家