分页 性能探讨
CREATE proc up_GetTopicList
@PageNo varchar(4)= '1 ',@PageSize varchar(4)= '20 '
as
/*定义局部变量*/
declare @a_intPageNo int
declare @a_intPageSize int
declare @intBeginID int
declare @intEndID int
declare @intRecordCount int
declare @intPageCount int
declare @intRowCount int
set @a_intPageNo = cast(@PageNo as bigint)
set @a_intPageSize = cast(@PageSize as int)
/*关闭计数*/
set nocount on
/*求该分类总数 */
select @intRecordCount = count(*) from company
if @intRecordCount = 0
return 0
/*判断页数是否正确*/
if(@a_intPageNo -1)* @a_intPageSize > @intRecordCount
return (-1)
/*求开始ID*/
set @intRowCount = (@a_intPageNo -1)*@a_intPageSize +1
/*限制条数*/
set rowcount @intRowCount
select @intBeginID = companyID from company order by companyID desc
/*结束ID*/
set @intRowcount = @a_intPageNo * @a_intPageSize
/*限制条数*/
set rowcount @intRowcount
select @intEndID = companyID from company order by companyID desc
/*恢复系统变量*/
set rowcount 0
set nocount off
select companyID,companyName,remark,editDate from company where companyID between @intEndID and @intBeginID order by companyID desc
return (@intRecordCount)
GO
=====================================================
strSql = "select Top " + pager.PageSize + " a.*,b.ClassName,c.TypeName,c.ModuleName,(select count(Id) from Comment where InfoId=a.Id) as CommentCount from [Info] a " +
" LEFT JOIN Category b ON a.CategoryId=b.Id " +
" LEFT JOIN Type c ON a.TypeId=c.Id " +
" where a.CategoryId=@CategoryId and a.Id not in(select Top " + (pager.CurrentPageIndex - 1) * pager.PageSize + " Id from [Info] where CategoryId=@CategoryId order by UpdateTime desc) order by UpdateTime desc ";
========================
CREATE procedure P_GetPagedOrders2000
(@startIndex int,
@pageSize int
)
as
set nocount on
declare @indextable table(id int identity(1,1),nid int)
declare @PageUpperBound int
set @PageUpperBound=@startIndex+@pagesize-1
set rowcount @PageUpperBound
insert into @indextable(nid) select orderid from orders order by orderid desc
select O.orderid,O.orderdate,O.customerid,C.CompanyName,E.FirstName+ ' '+E.LastName as EmployeeName
from orders O
left outer join Customers C
on O.CustomerID=C.CustomerID
left outer join Employees E
on O.EmployeeID=E.EmployeeID
inner join @indextable t on
O.orderid=t.nid
where t.id between @startIndex and @PageUpperBound order by t.id
set nocount off
RETURN
GO
欢迎大家讨论!顶者有分!
[解决办法]
先顶
[解决办法]
抢
[解决办法]
你们在干什么........
[解决办法]
抢
[解决办法]
顶一下,学习了
[解决办法]
我们都用临时表
[解决办法]
mark
[解决办法]
MARK
接分
[解决办法]
MARK
接分
[解决办法]
接分
[解决办法]
jf
[解决办法]
打劫!顶一下先
[解决办法]
即使在以前,为了动态决定 top N 中的n,SQL Server也有很多写法。例如将查询命令写入一个字符串,然后使用 select..... from execute 这样的语法执行这个命令;另外从更高级的应用层面设计,不需要使用存储过程,而应该用3GL程序代码产生完整的程序命令交给数据库系统执行(说命令比存储过程慢的人有大系统的统计数据说明到底慢多少吗?)。
另外,SQL Server2005早已经支持将 top N 这个N直接使用变量了,如果使用SQL Server2005还要搞这种研究,就有些孤陋寡闻了。
另外,我其实早就不再玩所谓的数据库分页了(我使用asp.net默认的分页方法)。其实,你应该统计统计,你的程序这样做有多大的价值。即使需要,也应该在判断数据量到一定程度的时候才调用数据库分页功能,不能动不动就用它分页吧。如果给你个锤子,你不要幼稚得见个钉子就想砸,甚至你应该把精力专注于玩瑞士军刀而不是锤子。
[解决办法]
楼上这位说得很对.当今还有这样的人.呵呵
[解决办法]
接分:)))))))))
[解决办法]
学习了
[解决办法]
考虑细节才是你提高的法宝。
支持楼主的精神
如果不用2005,我觉得需要考虑,你拿个50W以上的数据测试一下就知道了。默认的方式比存储过程分页方式慢好多。这只是一个客户端,如果是N个,就不得了了
[解决办法]
数据库 分页 全接触
与平时的分页不同 加了 对数据的2分处理 效率更高.
http://blog.csdn.net/hertcloud/category/281167.aspx
[解决办法]
JF,这样的文章网上好象不在少数.LZ搜一下肯定是一堆
[解决办法]
我也不太信任封装好的分页
[解决办法]
不懂
[解决办法]
js
[解决办法]
代码好长呀!
[解决办法]
学习了```
[解决办法]
这个一般都是这样的,至于快慢没认真研究过
[解决办法]
进来学习!
[解决办法]
学习一下
[解决办法]
up
[解决办法]
学习
[解决办法]
唉, 又见到存储过程分页,
我就用 GridView 的自动分页,
因为, 我数据还没达到, 需要 tradeoff 的时候
动不动就存储过程分页....
[解决办法]
学习来了
[解决办法]
楼主的分页不错的.我也一直是类似使用的.
[解决办法]
看到declare @indextable table(id int identity(1,1),nid int)
就知道性能不高了。
翻到后门的时候,添加的临时表的负担非常大的。
[解决办法]
采用存储过程分页效果比较好
[解决办法]
看到declare @indextable table(id int identity(1,1),nid int)
就知道性能不高了。
翻到后门的时候,添加的临时表的负担非常大的
=====================
这是表变量,比临时表好许多
[解决办法]
帮顶
[解决办法]
1、…… top N ……
2、…… top 10 …… <= N……
[解决办法]
顶
[解决办法]
路过学习下 UP JF
[解决办法]
up,xuexi,jf
[解决办法]
只要你自己觉得好就行了
[解决办法]
up,jf
[解决办法]
学习,顶一下
[解决办法]
good~
[解决办法]
strSql = "select Top " + pager.PageSize + " a.*,b.ClassName,c.TypeName,c.ModuleName,(select count(Id) from Comment where InfoId=a.Id) as CommentCount from [Info] a " +
" LEFT JOIN Category b ON a.CategoryId=b.Id " +
" LEFT JOIN Type c ON a.TypeId=c.Id " +
" where a.CategoryId=@CategoryId and a.Id not in(select Top " + (pager.CurrentPageIndex - 1) * pager.PageSize + " Id from [Info] where CategoryId=@CategoryId order by UpdateTime desc) order by UpdateTime desc ";
稍加修改 简单易用 而且效率不错 谢谢分享
[解决办法]
JF
只用自己的分页。。
归根揭底 现在的所谓存储过程分页都只是
1通过TOP 。WHERE IAUTOID NOT IN
2再或者临时表。。然后 IAUTOID 〉 AND 〈