sql多表关联,数据量比较大的分页查询,怎么做,有没有较好的方法,

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql多表关联,数据量比较大的分页查询,怎么做,有没有较好的方法,相关的知识,希望对你有一定的参考价值。

可以做一个存储过程,传入参数的方式,参数可以有显示第几页,分页大小,可以返回总行数和查询结果追问

因为每个表都有上万条数据。这样查出来也很慢

追答

你可以先count(*) 取得一下

参考技术A 拿空间换时间,先查出来放到临时表里,然后从临时表里分页查追问

查出来过程就很费时间了,。。我也试了放在临时表中,快了几秒

追答

对啊,所以查一次比查多次好点吧。。。

Sql Server多种分页性能的比较

一.前言

  因为工作关系,遇到了非常大的数据量的分页问题,数据总共有8000万吧,这个显然不是简单的分页能够解决的,需要从多多方面考虑,从分表、分库等等。但是这个也让我考虑到了分页性能的问题,在不同数据量的情况下,不同的分页方法效率是否会有不同。我在这里用比较常见的几种分页方法在不同的数据量、不同页码下进行对比,分别是:Top、Row_Number()和Offset Fetch。这里只用它们分别最简单的语句,如下。

  Top:

create proc Tops @pageindex int,@pagesize int
AS
BEGIN

select top (@pagesize) * from Customers where CustomerID not in 
(select top ((@pageindex - 1)* @pagesize) CustomerID from Customers order by CustomerID DESC) order by CustomerID DESC

END

  Row_Number():

create proc RowNumber @pageindex int,@pagesize int
AS
BEGIN

select * from 
(select ROW_NUMBER() OVER(order by CustomerID desc) as px,* from Customers) as a
where a.px between ((@pageindex - 1)* @pagesize + 1) and (@pageindex*@pagesize)

END

  Offset Fetch:

create proc Offset_Fetch @pageindex int,@pagesize int
AS
BEGIN

select * from Customers order by CustomerID desc
offset ((@pageindex - 1) * @pagesize) rows
fetch next @pagesize rows only  

END

  三个存储过程都对数据进行了排序,设置的语句相对公平,这里默认每页10条数据。Top的分页是基本上所有的版本的sql server都可以使用的,row_number()是sql 2005以上,offset fetch需要sql 2012才支持了。

 二.20W数据量

  1.Top

    第1页十次执行平均时间29.1毫秒。

    

    第1万页十次执行平均时间109.2毫秒。

    

    第2万页十次执行平均时间126.8毫秒。

    

  2.Row_Number()

   第1页十次执行平均时间20.2毫秒。

    

    第1万页十次执行平均时间96.5毫秒。

    

    第2万页十次执行平均时间153.8毫秒。

    

  3.Offset Fecth

   第1页十次执行平均时间19.3毫秒。

    

    第1万页十次执行平均时间70毫秒。

    

    第2万页十次执行平均时间75.1毫秒。

    

三.200W数据量

  1.Top

    第1页十次执行平均时间55.9毫秒。

     

    第10万页十次执行平均时间.....毫秒。

    执行了好几十秒。。。。直接淘汰

  2.Row_Number()

   第1页十次执行平均时间25.5毫秒

    

    第10万页十次执行平均时间642.3毫秒

    

    第20万页十次执行平均时间1257毫秒

    

  3.Offset Fecth

    第1页十次执行平均时间24.7毫秒

    

    第10万页十次执行平均时间220.5毫秒

    

    第20万页十次执行平均时间396毫秒

    

三.2000W数据量

  1.Top

   因为在上一轮被淘汰了,所以这一轮就算了。。

  2.Row_Number()

    第1页十次执行平均时间57毫秒

     

    第100W页十次执行平均时间6401.5毫秒

    

    第200W页十次执行平均时间14606.2毫秒

    

  3.Offset Fecth

   第1页十次执行平均时间27.5毫秒

    

    第100W页十次执行平均时间1778.9毫秒

    

    第200W页十次执行平均时间3523.2毫秒

    

四。总结

  可以看出来数据量越大、分页页码越大对分页效率影响就越大。top的分页方法早早出局,很明显是因为not in 的数据量太庞大了,所以要是有好的top分页方法可以下面留言,我也会进行测试。row_number的分页方法算是比较好的了,而且sql2005及以上的数据库都可以用,受众范围比较大,而offset fecth的性能更加优越,但是只有sql2012及以上的才支持。

  有什么问题欢迎讨论!

 

 

 

 

    

 

以上是关于sql多表关联,数据量比较大的分页查询,怎么做,有没有较好的方法,的主要内容,如果未能解决你的问题,请参考以下文章

mybatis分页查询怎么做

对数据分页后,2次查询的分页,点击上一页,下一页,首页,尾页,都会跳到2次查询之前的分页显示,怎么办

MySQL大数据量分页查询方法及其优化

关于mybatis+sqlserver 的多表关联的分页(注意要先分页在多表关联)

Sql Server多种分页性能的比较

Oracle的极大数据量的分页查询问题