首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

分页 性能探讨解决思路

2012-02-05 
分页 性能探讨CREATEprocup_GetTopicList@PageNovarchar(4) 1 ,@PageSizevarchar(4) 20as/*定义局部变量

分页 性能探讨
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 〈


热点排行