作者:雅蕙蕙蕙 | 来源:互联网 | 2023-09-05 10:36
问题使用如下存储过程实现在SQL2008中进度分页,测试时数据量为3800000万时,在SQL查询分析器中需要十几秒才会显示出结果,有什么方式可以把这个存储过程优化一下,提升查询效
问题
使用如下存储过程实现在SQL 2008中进度分页,测试时数据量为3800000万时,在SQL查询分析器中需要十几秒才会显示出结果,有什么方式可以把这个存储过程优化一下,提升查询效率
create procedure queryPage
@sqlstr nvarchar(4000), --查询字符串
@currentpage int, --第N页
@pagesize int --每页行数
as
set nocount on
declare @P1 int, --P1是游标的id
@rowcount int
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
select ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页
set @currentpage=(@currentpage-1)*@pagesize+1
exec sp_cursorfetch @P1,16,@currentpage,@pagesize
exec sp_cursorclose @P1
set nocount off
最佳回答
用游标效率当然低了。现在我用的翻页存储过程!可以参考一下
create procedure Turn_Page
@tbname varchar(50),--表名
@mainkey varchar(50),--主键
@wheresql varchar(500),--查询条件
@orderby varchar(50),--排序
@pageindex int,--当前页
@pagesize int --页数
as
begin
create table #temp (
id int identity(1,1),
nid varchar(50)
)
declare @sqlstr varchar(6000)
set @sqlstr ='select cast('+@mainkey+' as varchar(50)) from '+@tbname if @wheresql<>''
set @wheresql=@wheresql
set @sqlstr =@sqlstr+@wheresql
if @orderby=' '
set @orderby=@mainkey
set @sqlstr =@sqlstr+@orderby
set @sqlstr ='insert into #temp(nid) '+@sqlstr
execute(@sqlstr)
declare @v_StartIndex int
declare @v_EndIndex int
set @v_StartIndex = isnull((@pageindex-1)*@pagesize,0);
set @v_EndIndex=@pageindex*@pagesize;
set @sqlstr ='select * from '+@tbname+' tb inner join #temp temp on tb.'+@mainkey+'=temp.nid '
set @sqlstr =@sqlstr+@wheresql +' and temp.id >'+cast(@v_StartIndex as varchar)+' and temp.id<='+cast(@v_EndIndex as varchar) +@orderby
execute(@sqlstr)
end