问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如果在数据库中有大数据量,而我们用分页存储过程,怎么样才能效率高...

发布网友 发布时间:2022-05-17 10:42

我来回答

4个回答

好二三四 时间:2022-07-12 09:43

大数据量下的分页解决方法:要看你的数据存储是用的什么数据库了。常用的有mysql,sqlserver,oracle。没种数据库进行分页的SQL语句不同。

做大数据分页都是无刷新的技术,这里我们选择ajax来实现。ajax请求地址需要你使用后台代码来实现,后台代码除了要返回数据集合还要返回数据的总数量,总页数,下一页等参数,方便选择分页的时候获取数据。

下面看一下后台代码实现,sqlserver的分页SQL:selecttop一页数量*from表名where主键notin(selecttop15主键from表名)

mysql的分页语句SQL:select*from表名where主键>10orderbydeptnoascpmitn;

热心网友 时间:2022-07-12 06:51

如果你每页显示10条记录那么你就每次查询10条记录 在Oracle数据库中:方法一:
SELECT *
FROM databasetest t1
WHERE (SELECT count(*) FROM databasetest t2 WHERE t2.id < t1.id) >= 11 AND
(SELECT count(*) FROM databasetest t2 WHERE t2.id < t1.id) < 20
花费时间: 62.156秒方法二:
select *
from (select rownum as num,id,test1,test2 from databasetest a where rownum < 20)
where num > 11;
花费时间: 0.094秒
解释:rownum意为读取行号,首先读取小于20行的记录,然后在这些记录中读取行号大于10的记录,行号是整个表的同一分配。

方法三:
(select * from databasetest where rownum<=20) minus (select * from databasetest where rownum<11)
花费时间: 0.11秒

在SQL Server中方法一:
SELECT *
FROM databasetest t1
WHERE (SELECT count(*) FROM databasetest t2 WHERE t2.id < t1.id) >= 11 AND
(SELECT count(*) FROM databasetest t2 WHERE t2.id < t1.id) < 20
花费时间:id未加索引为18秒,加上索引后为7秒

方法二:
select top 10 * from databasetest where id not in (select top 10 id from databasetest);
花费时间: 小于1秒
解释:首先查找整个表的前10个记录,然后除前10个记录的其它记录中找前面10个记录。可理解为:在表中,除了前面10个记录,找出靠前的10个记录总结:
在Oracle最佳查询为第二种方法,使用rownum函数,在SQL Server中最佳查询为第二种方法,使用Top函数。
其中第一种方法使用于任何数据库。为了减少网络通信,同时又提高查询速度,可以使用缓冲。即一次查询足够多的记录,保存在缓存中,传给客户,当客户需要查看指定记录时,从缓存中取出数据。具体实现方案为:假如每页10条记录,如果查看第5页记录,则一次查找的40-69共三十条记录,存入缓存。当选择上一页,下一页时从缓存中读出数据,当查找第7页的数据时,再查找6-8页数据。减少了与数据库的网络通信,同时又提高了效率。

SQL语句实现数据分页(SQLServer)
SQLServer的分页依靠的是top这个属性。1.分页方案一:(利用Not In和SELECT TOP分页)SELECT TOP 页大小 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 页大小*页数 id
FROM 表
ORDER BY id))
ORDER BY ID2.分页方案二:(利用ID大于多少和SELECT TOP分页)SELECT TOP 页大小 *
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 页大小*页数 id
FROM 表
ORDER BY id) AS T))
ORDER BY ID常用的是方案1.这个不需要多说!方案2有局限性。

热心网友 时间:2022-07-12 08:09

--------------------------------
--关于分页储存的效率问题
--5个存储过程都是采用不同的方式
--------------------------------
------------------------------------------
--利用select top 和select not in进行分页--
------------------------------------------
create procere proc_paged_with_notin --利用select top and select not in
(
@pageIndex int, --页索引
@pageSize int --每页记录数
)
as
begin
set nocount on;
declare @timediff datetime --耗时
declare @sql nvarchar(500)
select @timediff=Getdate()
set @sql='select top '+str(@pageSize)+' * from tb_TestTable where(ID not in(select top '+str(@pageSize*@pageIndex)+' id from tb_TestTable order by ID ASC)) order by ID'
execute(@sql) --因select top后不支技直接接参数,所以写成了字符串@sql
select datediff(ms,@timediff,GetDate()) as 耗时
set nocount off;
endexec proc_paged_with_notin 10000,10
--------------------------------------
--利用select top 和 select max(列键)--
--------------------------------------
create procere proc_paged_with_selectMax --利用select top and select max(列)
(
@pageIndex int, --页索引
@pageSize int --页记录数
)
as
begin
set nocount on;
declare @timediff datetime
declare @sql nvarchar(500)
select @timediff=Getdate()
set @sql='select top '+str(@pageSize)+' * From tb_TestTable where(ID>(select max(id) From (select top '+str(@pageSize*@pageIndex)+' id From tb_TestTable order by ID) as TempTable)) order by ID'
execute(@sql)
select datediff(ms,@timediff,GetDate()) as 耗时
set nocount off;
end--------------------------------------------------------
--利用select top和中间变量--此方法因网上有人说效果最佳--
--------------------------------------------------------
create procere proc_paged_with_Midvar --利用ID>最大ID值和中间变量
(
@pageIndex int,
@pageSize int
)
as
declare @count int
declare @ID int
declare @timediff datetime
declare @sql nvarchar(500)
begin
set nocount on;
select @count=0,@ID=0,@timediff=getdate()
select @count=@count+1,@ID=case when @count<=@pageSize*@pageIndex then ID else @ID end from tb_testTable order by id
set @sql='select top '+str(@pageSize)+' * from tb_testTable where ID>'+str(@ID)
execute(@sql)
select datediff(ms,@timediff,getdate()) as 耗时
set nocount off;
end
---------------------------------------------------------------------------------------
--利用Row_number() 此方法为SQL server 2005中新的方法,利用Row_number()给数据行加上索引--
---------------------------------------------------------------------------------------
create procere proc_paged_with_Rownumber --利用SQL 2005中的Row_number()
(
@pageIndex int,
@pageSize int
)
as
declare @timediff datetime
begin
set nocount on;
select @timediff=getdate()
select * from (select *,Row_number() over(order by ID asc) as IDRank from tb_testTable) as IDWithRowNumber where IDRank>@pageSize*@pageIndex and IDRank<@pageSize*(@pageIndex+1)
select datediff(ms,@timediff,getdate()) as 耗时
set nocount off;
end
--------------------------
--利用临时表及Row_number--
--------------------------
create procere proc_CTE --利用临时表及Row_number
(
@pageIndex int, --页索引
@pageSize int --页记录数
)
as
set nocount on;
declare @ctestr nvarchar(400)
declare @strSql nvarchar(400)
declare @datediff datetime
begin
select @datediff=GetDate()
set @ctestr='with Table_CTE as
(select ceiling((Row_number() over(order by ID ASC))/'+str(@pageSize)+') as page_num,* from tb_TestTable)';
set @strSql=@ctestr+' select * From Table_CTE where page_num='+str(@pageIndex)
end
begin
execute sp_executesql @strSql
select datediff(ms,@datediff,GetDate())
set nocount off;
end
我们分别在每页10条数据的情况下在第2页,第1000页,第10000页,第100000页,第199999页进行测试,耗时单位:ms 每页测试5次取其平均值 存过第2页耗时第1000页耗时第10000页耗时第100000页耗时第199999页耗时效率排行1用not in0ms16ms47ms475ms953ms32用select max5ms16ms35ms325ms623ms13中间变量966ms970ms960ms945ms933ms54row_number0ms0ms34ms365ms710ms24临时表780ms796ms798ms780ms805ms4正好我正在研究这个问题 给大家分享

热心网友 时间:2022-07-12 09:43

不行
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
电脑开机时怎么进入安全模式 广东医学院大一新生宿舍怎么样,是不是都是学校分配,不能自己选择_百度... 2012高考理科 考到545 想知道怎么填志愿 我的分数545可以报广东医学院边d专业?我系广东考生 高考排名。高考报志愿。广东医学院。 今年545分补录广东医学院还有机会吗? 徒步穿什么鞋 夫妻之间感情再不好都不要去互相伤害 平时可以穿登山鞋吗 大学生都爱去哪些网站? 怎么样写个select通用的存储过程 老人与海读后感,800字,能不能请不要用网上搜来的文章,谢谢…… 请发至... 伟德和威廉希尔是不是同一家? 谁解释下interwetten开盘总是那么怪? 德国和塞尔维亚哪个会赢? 世界第一台电影反映机在什么时候发明的 世界上第一部电影放映机是谁发明出来的是那个国家? 电脑上输生份证号码怎样让他不缩写 14岁标准体重是多少 厨房位置在风水上有什么讲究?? 厨房风水也有讲究吗? 14岁女生标准的身高是多少厘米体重标准为多少 房子厨房风水的讲究有哪些 厨房方位有什么风水讲究 厨房在什么方位风水好 厨房的位置与住宅风水要注意什么 厨房位置在风水学上有哪些讲究? 厨房风水与五行有哪些讲究 C语言:键入一个不超过100字符的字符串,输出其中最长子字符串和它的长度。咋写? c++中在字符串sir中找出最大字符并放在第一个位置上,并将该字符前的字符往后顺序移动 如何用存储过程实现分页,在asp中调用存储过程,因为是初学者,需要详细代 ... sql 分页 和 存储过程的分页,那个更高效一点,我说的效率是使用在100万左右的数据量中的,使用那个更好? 一般网吧的机子用鲁大师跑分能跑多少? 一般网吧的机子用鲁大师跑分能跑多少 深圳南山画册设计排版。公司内刊设计 网吧的机子为什么配置也很低。跑分才3200.但是运行东西还是很流畅。 网吧电脑鲁大师跑分是十五万,按照网吧里的配置自己组装一台同样的电脑,性能会一样吗?跑分会变成多少? 电脑性能测评,鲁大师跑分多少算好,跑分标准 20世纪60年代谁提出了终身教育的理论? 耶克斯利和保罗朗格朗谁提出的终身教育 克里斯保罗的详细资料 保罗·朗格朗的终身教育思想 .终身教育思潮的主要代表人物是? 高分求助,一篇终身教育的文章 终身教育的积极倡导者和最终奠基人是谁 终身教育论? 终身教育理论最早产生于哪个国家? “终身教育” 名称解释 康熙通宝钱币后面那种字体,看不懂!哪里能知道这些字体的意思呢? 楷书康熙通宝?