使用如下存储过程实现在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
执行查询的是一条SQL语句,不是单个表
@泱泱: 如果多表查询的话,我是先把查询写成一个视图,然后翻页过程调用这个视图来进行
@反戈: 如果查询语句中包含order by 不允许生成视图的。如:select * from tab1 order by field1
为3800000万时 也就是380亿吗?
用的游标???直接改为row_number()分页,就应该能满足你的需求了。
建议用一下row_number() OVER()试试