CREATE PROCEDURE pageTest --用于翻页的测试
--需要把排序字段放在第一列 (
@FirstID nvarchar(20)=null, --当前页面里的第一条记录的排序字段的值
@LastID nvarchar(20)=null, --当前页面里的最后一条记录的排序字段的值
@isNext bit=null, --true 1 :下一页;false 0:上一页
@allCount int output, --返回总记录数
@pageSize int output, --返回一页的记录数
@CurPage int --页号(第几页)0:第一页;-1最后一页。
)ASif @CurPage=0
begin
--统计总记录数
select @allCount=count(ProductId) from Product_test
set @pageSize=10
--返回第一页的数据
select top 10
ProductId,
ProductName,
Introduction
from Product_test order by ProductId
endelse if @CurPage=-1 select * from
(select top 10 ProductId,
ProductName,
Introduction from Product_test order by ProductId desc ) as aa
order by ProductId
else begin
if @isNext=1
--翻到下一页
select top 10 ProductId,
ProductName,
Introduction
from Product_test where ProductId > @LastID order by ProductId
else
--翻到上一页
select * from
(select top 10 ProductId,
ProductName,
Introduction
from Product_test where ProductId < @FirstID order by ProductId desc) as bb order by ProductId
end
百万数据翻页就像100条数据一样!http://www.jyklzz.net/web/jyk/index.asp 这里有详细的说明
自定义翻面的意思就是:每次取得数据都是你根据页码来取到的!
dataGrid自带的数据分面就是将要的结果集全部查出来,然后再系统的分面,效率当然慢很多了!
我也一般是用自定义分页,不过存储过程没必要你那么复杂!
参数只要:
1。页面最大行
2。当前页码
3。查询结果集所要用到的参数(可以是存储过程,或临时表,或 查询串之类的)其它的下一页,等等都是通过前台处理再传进的页码而已
如果数据量很大,或则访问的人数很多,内存很容易就会被SQL Server占满了,导致网站的访问速度大大减慢。这个存储过程并不复杂,只是为了效率写的有点烦琐。
真有这么好吗?看不出来
当然了,不信你可以试一下。
如果ORACLE的呢?
如果ORACLE的呢?换成 ORACLE的语法吗。
思路应该是一样的。
另外说明一点:对于10万以上的数据,排序字段最好是主键,也就是给排序字段作索引,否则的话会受到一定的影响。http://218.24.108.91:9006/newsManage/test4.aspx
这是一个829920 条数据的事例。由于是在我的电脑上,所以在我关机前都是可以看到的,如果看不到就说明我已经关机了:)另外发现了一个问题:select count(*) from table 在执行的时候很占用内存
50万条数据就要占用70多M的内存,但是呢82万条数据也是占用差不多相同的内存。不太清楚,sql统计记录数,为什么会占用这么大的内存???
这里讲的方法,和我的思路是一样的,由于我还没找到一个高效的指定页号翻页的方法,所以呢我的存储过程里面就没有这个功能。他的指定页用了not in 方法,这对于海量数据是无法容忍的一定会把服务器托死的,当然了对于一般的数据是没什么问题了。对于他的方法我感觉有很多不足的地方。
1.存储过程的用了 EXEC(@sql) ,与其这样的话,还不如直接写sql查询语句呢,可以写成一个函数或者是 类,效率应该差不了多少。2.如果说是通用,那么就是说在不改变存储过程的情况下可以应付很多种情况,那么如果是两个或多个表联合呢?怎么做呀?好象只能对一个表翻页;
如果要加查询条件呢?不是对表里的所有的记录翻页,只翻符合条件的怎么办呢?3.没有 总页数 、总记录数。4.只能按一个字段排序不能按多个字段排序。
我的存储过程只是一个“模版”对于每个新的查询都要作一定的修改,虽然麻烦,但灵活性也就在其中——怎么改都可以。可以加查询条件,可以加联合表的语句。虽然不能按多个字段排序,但是把多出的排序字段转化为查询条件。大家可以到 http://news.sanhaoonline.com/listdetail.aspx 看一下。这个网页的翻页已经应用了这个存储过程。它可以按分类(两种分类)翻页、按查询条件翻页,都是一个页面,一个存储过程实现的。说了这些没有别的意思,只是希望大家能够取长补短,共同发展,一起进步。
如果你想浏览的话,为什么不从第一页开始呢?
如果你想看你想看的内容的话,我有很高效的查询。这样会更受用户的欢迎。
3.网站的总体性能
因为没有找到一个很好的节省资源的解决方法。
1. 根据当前记录集的上限/下限
2. 是否向下翻页来实现分页我现在的数据有50万以上的记录,
分页解决方法当初也是这样实现的.
但主要存在如下问题:1. 用户只是用"上一页", "下一页", 不能直接从第1页跳到第4页...
2. 如果当前是第4页, 在另一个客户端有人将第4页前的记录删除了一些, 结果会怎?建议将
@isNext bit=null, --true 1 :下一页;false 0:上一页
参数改成是
@OldPageIndex int --翻页前的页号
declare @i int
declare @count int
set @i=0
set @count=0 --0:第二页 1:第三页 --由大到小排列
select top 10 @ID=ID from table order by ID desc --一页10条记录
while @i< @count
begin
select top 10 @ID=ID from table where ID<@ID order by ID desc
set @i=@i+1endselect top 10 * from table where ID<@ID order by ID desc --返回记录
2.主要是用在前台页面,所以就不涉及到删除了。
如果用于后台的话,那还要加好多的功能,比如更新当前页,更换排序字段等等。