zoukankan      html  css  js  c++  java
  • 数据分页SQL语句的比较

    建立表

    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万条,用更多的数据测试会明显一些)

    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 

    分页方案一:(利用SqlServer2005中的新特性ROW_NUMBER进行分页)

    Select * FROM (
      select ROW_NUMBER()Over(order by id desc) as rowId,* from TestTable
    ) as mytable
    where rowId between 21 and 40

    说明:效率高,但存在版本兼容性问题,只兼容SQL SERVER2005及以上版本

    分页方案二:(利用Not InSELECT TOP分页)

    SELECT TOP 10 *
    FROM TestTable
    WHERE (ID NOT IN
    (SELECT TOP 20 id
    FROM TestTable
    ORDER BY id))
    ORDER BY ID

    说明:效率次之,根据主键ID分页,也可根据其他排序字段分页。与方案三相比较,在处理1000条以下数据时,效率优于方案三。但处理大数据时次于方案三。  

    分页方案三:(利用ID大于多少和SELECT TOP分页)

    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 

    说明:效率次之,自能根据主键ID分页,也可根据其他排序字段分页(将id替换为排序字段名),在1000条以上数据检索时,效率高于方案二

    分页方案四:无主键表,使用临时表分页

    备注:SQL Server 查看查询时间,依次点击查询->查询选项->高级->选中“SET STATISTICS TIME”->确定。在“消息”中查看查询时间

  • 相关阅读:
    在win7 64位上安装VS2015的问题汇总
    关于C#类的深拷贝的问题
    线程、进程
    c#日志 log4net
    C#常识
    Tribon数据抽取的一些心得
    Java Web相关课程学习笔记
    过滤器、监听器、拦截器的区别
    SHH架构中几个配置文件解释 applicationContext.xml web.xml struts.xml
    vue关于动态增加路由页面
  • 原文地址:https://www.cnblogs.com/archip/p/3394722.html
Copyright © 2011-2022 走看看