zoukankan      html  css  js  c++  java
  • SQL优化:分页方法从top->row_number->offset的演化

    1、top

    这种方法主要是在sql server 2000中使用,效率较差,这里就不详细说了。


    2、row_number函数

    这种方法是sql server 2005以后,支持了row_number函数后,才开始使用的。

    一开始是这么写的,但是效率不好:

    declare @page_size int;
    declare @page_num int;
    
    --比如:每页10条记录
    set @page_size = 10;
    
    --比如:先取第2页
    set @page_num = 2;
    
    
    select *
    from
    (
    select *,
    
           (row_number() over(order by 图书编号) - 1) / @page_size as rownum
    from test 
    )t
    where rownum = @page_num - 1
    


    修改一下,直接用范围来限制:

    declare @page_size int;
    declare @page_num int;
    
    --比如:每页10条记录
    set @page_size = 10;
    
    --比如:先取第2页
    set @page_num = 2;
    
    
    select *
    from
    (
    select *,
           row_number() over(order by 图书编号) as rownum
    from test 
    )t
    where rownum between (@page_num-1)*@page_size+1 and @page_num*@page_size


    3、SQL Server 2012开始支持的 offset fetch next 方法

    declare @page_size int;
    declare @page_num int;
    
    --比如:每页10条记录
    set @page_size = 10;
    
    --比如:先取第2页
    set @page_num = 2;
    
    select *
    from test
    order by 图书编号
    offset (@page_num-1)*@page_size rows
    fetch next @page_size rows only

    附录:

    建表代码,表test包含主键,且为自增列:

    CREATE TABLE [dbo].[test](
    	[图书编号] [decimal](10, 0) IDENTITY(1,1) NOT NULL,
    	[书名] [varchar](80) NOT NULL,
    	[作者] [varchar](80) NOT NULL,
    	[出版社] [int] NOT NULL,
    	[出版日期] [datetime] NOT NULL,
    	[图书类型] [int] NOT NULL,
    	[ISBN号] [varchar](40) NOT NULL,
    	[定价] [float] NOT NULL,
    	[图书数量] [tinyint] NOT NULL
    ) ON [PRIMARY]
    
    
    insert into test
    (
    [书名]
          ,[作者]
          ,[出版社]
          ,[出版日期]
          ,[图书类型]
          ,[ISBN号]
          ,[定价]
          ,[图书数量]
    )
    select [书名]
          ,[作者]
          ,[出版社]
          ,[出版日期]
          ,[图书类型]
          ,[ISBN号]
          ,[定价]
          ,[图书数量]
    from test
    go 15
    
    alter table [test]
    add constraint pk_test primary key([图书编号])
    

    数据条数为432万条:

    --4325376
    select count(*) from test


  • 相关阅读:
    《整理的艺术》读后感
    就算神游 之二:行路 2
    VBA实现outlook自动发信 2
    使用Event的体会
    DevExpress Asp.net(9) ASPxHiddenField的特性与基本使用
    .net 启动窗休的设计总结
    DevExpress Asp.net(5) ASPxCloudControl的基本使用
    DevExpress Asp.net(7) ASPxTreeList的基本使用之一
    数据结构树形结构(1)
    数据结构树形结构(2)
  • 原文地址:https://www.cnblogs.com/momogua/p/8304426.html
Copyright © 2011-2022 走看看