有一表(ProductInfo)有20万条记录,写出它的分页sql语句

时间:2022-01-16 14:45:29
有一表(ProductInfo)有20万条记录,写出它的分页sql语句。表中有ID(int) 标识列,要求性能好,效率高!注:区限记录(beginrecord,endrecord)  每页20记录 当前页pageIndex

我写了两个:
1、select * from (select *,ROW_NUMBER() OVER(ORDER BY ID Asc) AS 'rownumber' from ProductInfo) T 
where T.rownumber between  beginrecord and endrecord

2、select top(20) * from ProductInfo 
where (id not in (select top(20*(pageIndex-1)) ID from ProductInfo order by ID)) 
order by ID Asc

我发现 数据库 一大。同时访问的人多 ,很耗性能,
请问 大家有 更改 的 办法没有

10 个解决方案

#1


id上有索引吧。还有动态的尽量用
exec sp_executesql 

#2



select top 20 * from productinfo where id>
(select max(id) from 
(select top (20*(pageIndex-1)) ID from ProductInfo order by ID)a)
order by id

--将id设置为主键。

#3


引用 1 楼 jinfengyiye 的回复:
id上有索引吧。还有动态的尽量用
exec sp_executesql


没有 明白什么 意思 

#4


不知道你们的服务器每秒有多少个读取请求。

立竿见影的办法,如果还没有做的话,叫DBA把数据库复制8个。

另:分页一般是需要app里cache结果才能达到最佳效果的,光靠数据库不是最好的办法。

#5


to geliph


引用 4 楼 geliph 的回复:
不知道你们的服务器每秒有多少个读取请求。

立竿见影的办法,如果还没有做的话,叫DBA把数据库复制8个。

另:分页一般是需要app里cache结果才能达到最佳效果的,光靠数据库不是最好的办法。


你说的我没有明白。
数据读取相当频繁,一秒钟有200-500个查询请求,这样该如何处理,请高人指点啊

#6


把这个数据库复制到8个服务器上,其中分出4个专门处理有关分页的查询,另四个处理别的查询。这是做到数据库的分工。

同时检查App里的cache,根据实际情况调节cache的时间。.net就可以很方便的做了。这是保证不让所有的请求都直接变成最昂贵的数据库请求。但很多大公司都有专门的cache系统,把最近100来天的查询都放到内存里了。

你的情况现在只有20万的数据,只是分页查询请求很多,我猜是你们的App没用上cache的问题,不知道是不是?你设个10分钟试试看。

#7


引用 6 楼 geliph 的回复:
把这个数据库复制到8个服务器上,其中分出4个专门处理有关分页的查询,另四个处理别的查询。这是做到数据库的分工。

同时检查App里的cache,根据实际情况调节cache的时间。.net就可以很方便的做了。这是保证不让所有的请求都直接变成最昂贵的数据库请求。但很多大公司都有专门的cache系统,把最近100来天的查询都放到内存里了。

你的情况现在只有20万的数据,只是分页查询请求很多,我……



我的程序是  socekt 服务,接到请求查询数据 然后返回给各个客户端  

#8


在socket服务里写个堆栈,把10分钟内的请求和结果全cache起来。

就算cache 1分钟,你的整个系统性能也会大幅提升。

事实上,只要不是real time的都可以cache,而real time的数据又需要加锁防止修改的,所以完全没有必要每个请求都去查数据库。

不知道你们的架构师是怎么设计的。应该有个cost per call的调查和计划。

#9


引用 8 楼 geliph 的回复:
在socket服务里写个堆栈,把10分钟内的请求和结果全cache起来。

就算cache 1分钟,你的整个系统性能也会大幅提升。

事实上,只要不是real time的都可以cache,而real time的数据又需要加锁防止修改的,所以完全没有必要每个请求都去查数据库。

不知道你们的架构师是怎么设计的。应该有个cost per call的调查和计划。


我的数据是时时进入的,然后他们可以马上查询的到。不知道你有什么联系方式能不能提供下,私下交流下。等你消息,然后揭贴

#10


该回复于2011-03-24 15:10:47被版主删除

#1


id上有索引吧。还有动态的尽量用
exec sp_executesql 

#2



select top 20 * from productinfo where id>
(select max(id) from 
(select top (20*(pageIndex-1)) ID from ProductInfo order by ID)a)
order by id

--将id设置为主键。

#3


引用 1 楼 jinfengyiye 的回复:
id上有索引吧。还有动态的尽量用
exec sp_executesql


没有 明白什么 意思 

#4


不知道你们的服务器每秒有多少个读取请求。

立竿见影的办法,如果还没有做的话,叫DBA把数据库复制8个。

另:分页一般是需要app里cache结果才能达到最佳效果的,光靠数据库不是最好的办法。

#5


to geliph


引用 4 楼 geliph 的回复:
不知道你们的服务器每秒有多少个读取请求。

立竿见影的办法,如果还没有做的话,叫DBA把数据库复制8个。

另:分页一般是需要app里cache结果才能达到最佳效果的,光靠数据库不是最好的办法。


你说的我没有明白。
数据读取相当频繁,一秒钟有200-500个查询请求,这样该如何处理,请高人指点啊

#6


把这个数据库复制到8个服务器上,其中分出4个专门处理有关分页的查询,另四个处理别的查询。这是做到数据库的分工。

同时检查App里的cache,根据实际情况调节cache的时间。.net就可以很方便的做了。这是保证不让所有的请求都直接变成最昂贵的数据库请求。但很多大公司都有专门的cache系统,把最近100来天的查询都放到内存里了。

你的情况现在只有20万的数据,只是分页查询请求很多,我猜是你们的App没用上cache的问题,不知道是不是?你设个10分钟试试看。

#7


引用 6 楼 geliph 的回复:
把这个数据库复制到8个服务器上,其中分出4个专门处理有关分页的查询,另四个处理别的查询。这是做到数据库的分工。

同时检查App里的cache,根据实际情况调节cache的时间。.net就可以很方便的做了。这是保证不让所有的请求都直接变成最昂贵的数据库请求。但很多大公司都有专门的cache系统,把最近100来天的查询都放到内存里了。

你的情况现在只有20万的数据,只是分页查询请求很多,我……



我的程序是  socekt 服务,接到请求查询数据 然后返回给各个客户端  

#8


在socket服务里写个堆栈,把10分钟内的请求和结果全cache起来。

就算cache 1分钟,你的整个系统性能也会大幅提升。

事实上,只要不是real time的都可以cache,而real time的数据又需要加锁防止修改的,所以完全没有必要每个请求都去查数据库。

不知道你们的架构师是怎么设计的。应该有个cost per call的调查和计划。

#9


引用 8 楼 geliph 的回复:
在socket服务里写个堆栈,把10分钟内的请求和结果全cache起来。

就算cache 1分钟,你的整个系统性能也会大幅提升。

事实上,只要不是real time的都可以cache,而real time的数据又需要加锁防止修改的,所以完全没有必要每个请求都去查数据库。

不知道你们的架构师是怎么设计的。应该有个cost per call的调查和计划。


我的数据是时时进入的,然后他们可以马上查询的到。不知道你有什么联系方式能不能提供下,私下交流下。等你消息,然后揭贴

#10


该回复于2011-03-24 15:10:47被版主删除