首页 新闻 会员 周边

SQL server 2008 存储过程分页实现,怎么提升效率

0
悬赏园豆:5 [已解决问题] 解决于 2013-10-14 13:22
使用如下存储过程实现在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
泱泱的主页 泱泱 | 初学一级 | 园豆:2
提问于:2013-09-09 17:43
< >
分享
最佳答案
0

用游标效率当然低了。现在我用的翻页存储过程!可以参考一下

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

收获园豆:5
反戈 | 初学一级 |园豆:168 | 2013-09-11 14:08

执行查询的是一条SQL语句,不是单个表

泱泱 | 园豆:2 (初学一级) | 2013-09-12 18:55

@泱泱: 如果多表查询的话,我是先把查询写成一个视图,然后翻页过程调用这个视图来进行

反戈 | 园豆:168 (初学一级) | 2013-09-15 23:25

@反戈: 如果查询语句中包含order by 不允许生成视图的。如:select * from tab1 order by field1

泱泱 | 园豆:2 (初学一级) | 2013-09-18 13:58
其他回答(4)
0

为3800000万时  也就是380亿吗?

Albert Fei | 园豆:2102 (老鸟四级) | 2013-09-09 17:51
1

建议使用CTE(Common Table Expressions,公用表表达式)

参考:SQL Server2005的几种分页方法

然后优化一下索引

dudu | 园豆:30994 (高人七级) | 2013-09-09 18:01
0

用的游标???直接改为row_number()分页,就应该能满足你的需求了。

幻天芒 | 园豆:37175 (高人七级) | 2013-09-09 18:32
0

建议用一下row_number() OVER()试试

li-peng | 园豆:954 (小虾三级) | 2013-09-10 09:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册