zoukankan      html  css  js  c++  java
  • SQL Server数据库三种分页方案详尽分析

    本文采用三种分页办法,最后对三种分页办法分析了其优缺点。

    建立表:

    <CCID_NOBR>

    <CCID_CODE>CREATE TABLE [TestTable] (
     [ID] [int] IDENTITY (1, 1) NOT NULL ,
     [FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
     [LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
     [Country] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
     [Note] [nvarchar] (2000) COLLATE Chinese_PRC_CI_AS NULL 
    ) ON [PRIMARY]
    GO

    插入数据:(2万条,用更多的数据测试会明显一些)

    <CCID_NOBR>

    <CCID_CODE>SET IDENTITY_INSERT TestTable ON
    
    declare @i int
    set @i=1
    while @i<=20000
    begin
        insert into TestTable([id], FirstName, LastName, Country,Note)
     values(@i, 'FirstName_XXX','LastName_XXX','Country_XXX','Note_XXX')
        set @i=@i+1
    end
    
    SET IDENTITY_INSERT TestTable OFF

    分页方案一:

    (利用Not In和SELECT TOP分页)

    语句形式:

    <CCID_NOBR>

    <CCID_CODE>SELECT TOP 10 *
    FROM TestTable
    WHERE (ID NOT IN
              (SELECT TOP 20 id
             FROM TestTable
             ORDER BY id))
    ORDER BY ID
    
    
    SELECT TOP 页大小 *
    FROM TestTable
    WHERE (ID NOT IN
              (SELECT TOP 页大小*页数 id
             FROM 表
             ORDER BY id))
    ORDER BY ID

    分页方案二:

    (利用ID大于多少和SELECT TOP分页)

    语句形式:

    <CCID_NOBR>

    <CCID_CODE>SELECT TOP 10 *
    FROM TestTable
    WHERE (ID >
              (SELECT MAX(id)
             FROM (SELECT TOP 20 id
                     FROM TestTable
                     ORDER BY id) AS T))
    ORDER BY ID
    
    
    SELECT TOP 页大小 *
    FROM TestTable
    WHERE (ID >
              (SELECT MAX(id)
             FROM (SELECT TOP 页大小*页数 id
                     FROM 表
                     ORDER BY id) AS T))
    ORDER BY ID

    分页方案三:

    (利用SQL的游标存储过程分页)

    <CCID_NOBR>

    <CCID_CODE>create  procedure XiaoZhengGe
    @sqlstr nvarchar(4000), --查询字符串
    @currentpage int, --第N页
    @pagesize int --每页行数
    as
    set nocount on
    declare @P1 int, --P1是游标的id
     @rowcount int
    exec sp_cursoropen @P1 output,@sqlstr,
    @scrollopt=1,@ccopt=1,@rowcount=@rowcount output
    select ceiling(1.0*@rowcount/@pagesize) 
    as 总页数--,@rowcount as 总行数,@currentpage as 当前页 
    set @currentpage=(@currentpage-1)*@pagesize+1
    exec sp_cursorfetch @P1,16,@currentpage,@pagesize 
    exec sp_cursorclose @P1
    set nocount off

    其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。

    建议优化的时候,加上主键和索引,查询效率会提高。

    通过SQL 查询分析器,显示比较:我的结论是:

    分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句。

    分页方案一:(利用Not In和SELECT TOP分页)效率次之,需要拼接SQL语句。

    分页方案三:(利用SQL的游标存储过程分页)效率最差,但是最为通用。

  • 相关阅读:
    css绘制各种图形,三角形,长方形,梯形
    函数中,对形参做不加var的全局溢出赋值,可改变形参所指向的实参的本身值
    求数组中最大值,最小值
    placeholder 效果的实现,input提示字,获取焦点时消失
    js里apply用法
    jquery.lazyload.js-v1.9.1延时加载插件,已兼容ie6和各大浏览器
    移动端 元素外面使用伪类after加边框 导致其内部元素无法选中
    element组件知识点总结
    常用样式总结
    深入理解iframe
  • 原文地址:https://www.cnblogs.com/baishiying/p/2706029.html
Copyright © 2011-2022 走看看