高效的SQLSERVER分页查询

Sqlserver数据库分页查询一直是Sqlserver的短板,闲来无事,想出几种方法,假设有表ARTICLE,字段ID、YEAR...(其他省略),数据53210条(客户真实数据,量不大),分页查询每页30条,查询第1500页(即第45001-45030条数据),字段ID聚集索引,YEAR无索引,Sqlserver版本:2008R2

第一种方案、最简单、普通的方法:

代码如下:
[sql] view plaincopy
  1. SELECT TOP 30 * FROM ARTICLE WHERE ID NOT IN(SELECT TOP 45000 ID FROM ARTICLE ORDER BY YEAR DESC, ID DESCORDER BY YEAR DESC,ID DESC  

     平均查询100次所需时间:45s

第二种方案:

代码如下:

[sql] view plaincopy
  1. SELECT * FROM (  SELECT TOP 30 * FROM (SELECT TOP 45030 * FROM ARTICLE ORDER BY YEAR DESC, ID DESC) f ORDER BY f.YEAR ASC, f.ID DESC) s ORDER BY s.YEAR DESC,s.ID DESC   

     平均查询100次所需时间:138S

第三种方案:

代码如下:

[sql] view plaincopy
  1. SELECT * FROM ARTICLE w1,   
  2. (  
  3.     SELECT TOP 30 ID FROM   
  4.     (  
  5.         SELECT TOP 50030 ID, YEAR FROM ARTICLE ORDER BY YEAR DESC, ID DESC  
  6.     ) w ORDER BY w.YEAR ASC, w.ID ASC  
  7. ) w2 WHERE w1.ID = w2.ID ORDER BY w1.YEAR DESC, w1.ID DESC  

     平均查询100次所需时间:21S

第四种方案:

代码如下:
[sql] view plaincopy
  1. SELECT * FROM ARTICLE w1   
  2.     WHERE ID in   
  3.         (  
  4.             SELECT top 30 ID FROM   
  5.             (  
  6.                 SELECT top 45030 ID, YEAR FROM ARTICLE ORDER BY YEAR DESC, ID DESC  
  7.             ) w ORDER BY w.YEAR ASC, w.ID ASC  
  8.         )   
  9.     ORDER BY w1.YEAR DESC, w1.ID DESC  

     平均查询100次所需时间:20S

第五种方案:

代码如下:

[sql] view plaincopy
  1. SELECT w2.n, w1.* FROM ARTICLE w1, (  SELECT TOP 50030 row_number() OVER (ORDER BY YEAR DESC, ID DESC) n, ID FROM ARTICLE ) w2 WHERE w1.ID = w2.ID AND w2.n > 50000 ORDER BY w2.n ASC   

     平均查询100次所需时间:15S

查询第1000-1030条记录

第一种方案:

代码如下:

[sql] view plaincopy
  1. SELECT TOP 30 * FROM ARTICLE WHERE ID NOT IN(SELECT TOP 1000 ID FROM ARTICLE ORDER BY YEAR DESC, ID DESCORDER BY YEAR DESC,ID DESC   

     平均查询100次所需时间:80s

第二种方案:

代码如下:

[sql] view plaincopy
  1. SELECT * FROM  (   SELECT TOP 30 * FROM (SELECT TOP 1030 * FROM ARTICLE ORDER BY YEAR DESC, ID DESC) f ORDER BY f.YEAR ASC, f.ID DESC) s ORDER BY s.YEAR DESC,s.ID DESC   

     平均查询100次所需时间:30S

第三种方案:

代码如下:
[sql] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. SELECT * FROM ARTICLE w1,   
  2. (  
  3.     SELECT TOP 30 ID FROM   
  4.     (  
  5.         SELECT TOP 1030 ID, YEAR FROM ARTICLE ORDER BY YEAR DESC, ID DESC  
  6.     ) w ORDER BY w.YEAR ASC, w.ID ASC  
  7. ) w2 WHERE w1.ID = w2.ID ORDER BY w1.YEAR DESC, w1.ID DESC  

     平均查询100次所需时间:12S

第四种方案:

代码如下:
[sql] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. SELECT * FROM ARTICLE w1   
  2.     WHERE ID in   
  3.         (  
  4.             SELECT top 30 ID FROM   
  5.             (  
  6.                 SELECT top 1030 ID, YEAR FROM ARTICLE ORDER BY YEAR DESC, ID DESC  
  7.             ) w ORDER BY w.YEAR ASC, w.ID ASC  
  8.         )   
  9.     ORDER BY w1.YEAR DESC, w1.ID DESC  

     平均查询100次所需时间:13S

第五种方案:

代码如下:

[sql] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. SELECT w2.n, w1.* FROM ARTICLE w1,(   SELECT TOP 1030 row_number() OVER (ORDER BY YEAR DESC, ID DESC) n, ID FROM ARTICLE) w2 WHERE w1.ID = w2.ID AND w2.n > 1000 ORDER BY w2.n ASC   

     平均查询100次所需时间:14S

     由此可见在查询页数靠前时,效率3>4>5>2>1,页码靠后时5>4>3>1>2,再根据用户习惯,一般用户的检索只看最前面几页,因此选择3 4 5方案均可,若综合考虑方案5是最好的选择,但是要注意SQL2000不支持row_number()函数,由于时间和条件的限制没有做更深入、范围更广的测试,有兴趣的可以仔细研究下。

以下是根据第四种方案编写的一个分页存储过程:

代码如下:

[sql] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sys_Page_v2]'and OBJECTPROPERTY(id, N'IsProcedure') = 1)  
  2. drop procedure [dbo].[sys_Page_v2]  
  3. GO  
  4. CREATE PROCEDURE [dbo].[sys_Page_v2]  
  5. @PCount int output,    --总页数输出  
  6. @RCount int output,    --总记录数输出  
  7. @sys_Table nvarchar(100),    --查询表名  
  8. @sys_Key varchar(50),        --主键  
  9. @sys_Fields nvarchar(500),    --查询字段  
  10. @sys_Where nvarchar(3000),    --查询条件  
  11. @sys_Order nvarchar(100),    --排序字段  
  12. @sys_Begin int,        --开始位置  
  13. @sys_PageIndex int,        --当前页数  
  14. @sys_PageSize int        --页大小  
  15. AS  
  16. SET NOCOUNT ON  
  17. SET ANSI_WARNINGS ON  
  18. IF @sys_PageSize < 0 OR @sys_PageIndex < 0  
  19. BEGIN          
  20. RETURN  
  21. END  
  22. DECLARE @new_where1 NVARCHAR(3000)  
  23. DECLARE @new_order1 NVARCHAR(100)  
  24. DECLARE @new_order2 NVARCHAR(100)  
  25. DECLARE @Sql NVARCHAR(4000)  
  26. DECLARE @SqlCount NVARCHAR(4000)  
  27. DECLARE @Top int  
  28. if(@sys_Begin <=0)  
  29.     set @sys_Begin=0  
  30. else  
  31.     set @sys_Begin=@sys_Begin-1  
  32. IF ISNULL(@sys_Where,'') = ''  
  33.     SET @new_where1 = ' '  
  34. ELSE  
  35.     SET @new_where1 = ' WHERE ' + @sys_Where  
  36. IF ISNULL(@sys_Order,'') <> ''   
  37. BEGIN  
  38.     SET @new_order1 = ' ORDER BY ' + Replace(@sys_Order,'desc','')  
  39.     SET @new_order1 = Replace(@new_order1,'asc','desc')  
  40.     SET @new_order2 = ' ORDER BY ' + @sys_Order  
  41. END  
  42. ELSE  
  43. BEGIN  
  44.     SET @new_order1 = ' ORDER BY ID DESC'  
  45.     SET @new_order2 = ' ORDER BY ID ASC'  
  46. END  
  47. SET @SqlCount = 'SELECT @RCount=COUNT(1),@PCount=CEILING((COUNT(1)+0.0)/'  
  48.             + CAST(@sys_PageSize AS NVARCHAR)+') FROM ' + @sys_Table + @new_where1  
  49. EXEC SP_EXECUTESQL @SqlCount,N'@RCount INT OUTPUT,@PCount INT OUTPUT',  
  50.                @RCount OUTPUT,@PCount OUTPUT  
  51. IF @sys_PageIndex > CEILING((@RCount+0.0)/@sys_PageSize)    --如果输入的当前页数大于实际总页数,则把实际总页数赋值给当前页数  
  52. BEGIN  
  53.     SET @sys_PageIndex =  CEILING((@RCount+0.0)/@sys_PageSize)  
  54. END  
  55. set @sql = 'select '+ @sys_fields +' from ' + @sys_Table + ' w1 '  
  56.     + ' where '+ @sys_Key +' in ('  
  57.         +'select top '+ ltrim(str(@sys_PageSize)) +' ' + @sys_Key + ' from '  
  58.         +'('  
  59.             +'select top ' + ltrim(STR(@sys_PageSize * @sys_PageIndex + @sys_Begin)) + ' ' + @sys_Key + ' FROM '  
  60.         + @sys_Table + @new_where1 + @new_order2   
  61.         +') w ' + @new_order1  
  62.     +') ' + @new_order2  
  63. print(@sql)  
  64. Exec(@sql)  
  65. GO  

文章来源:CSDN
作者:语不惊人死不休
查看原文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328562.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中classLoader浅析

转载自 Java中classLoader浅析本文为在公司内部TD上写的一篇小文, 主要讲解java中classLoader基础知识, 现在拿来这里分享一下. 一、问题 请在Eclipse中新建如下类&#xff0c;并运行它&#xff1a; package java.lang;public class Long {public static void main(String[] …

微软BUG Bounty悬赏项目扩展至.NET Core和ASP.NET Core

微软宣布自 2016 年 9 月 1 日开始将 .NET Core 和 ASP.NET 纳入到 BUG Bounty 悬赏项目范围内&#xff0c;微软将会为 Windows 和 Linux 平台上的两个编程代码提供漏洞悬赏。 微软公布的细节中写道&#xff1a; 微软将会为、最新微软 .NET Core 和 ASP.NET Core 的最新 RTM 版…

计算字典的个数_[LeetCode] 440. 字典序的第K小数字

题目链接&#xff1a; https://leetcode-cn.com/problems/k-th-smallest-in-lexicographical-order难度&#xff1a;困难通过率&#xff1a;28.4%题目描述:给定整数 n 和 k&#xff0c;找到 1 到 n 中字典序第 k 小的数字。注意&#xff1a;1 ≤ k ≤ n ≤ 109。示例:**输入:**…

ASP.NET Core开发-Docker部署运行

ASP.NET Core开发Docker部署&#xff0c;.NET Core支持Docker 部署运行。我们将ASP.NET Core 部署在Docker 上运行。 大家可能都见识过Docker &#xff0c;今天我们就详细了解一下Docker的用途&#xff0c;以及真实的应用场景。 Docker源于PaaS&#xff0c;PaaS的应用场景即是D…

java异常捕获的一点感悟

转载自 java异常捕获的一点感悟 class Annoyance extends Exception {} class Sneeze extends Annoyance {} class Human { public static void main(String[] args) throws Exception { try { try { throw new Sneeze(); } catch ( Annoyance a ) { System.out…

android修改机型cpu,mac,androidid....

https://blog.csdn.net/yyy_bbb_lll/article/details/80734881 android 改机&#xff0c;抹机工具开发 一 2018年06月19日 16:43:40 阅读数&#xff1a;865 本工具以Xposed框架为基础&#xff0c;实现了改机软件所需的大部分功能。先贴界面图&#xff1a; 设备基本信息的显示…

data layui table 排序_浅谈layui中table的sort排序

table模块是layui框架最核心的组成之一&#xff0c;它用于对表格进行一些列功能和动态化数据操作&#xff0c;本文介绍了layui中table的sort排序&#xff0c;解决了在我们使用sort排序时可能遇到的一些问题。今天来谈谈table sort的那点事。预告一下&#xff0c;目的是做到前台…

gRPC C#学习

前些天gRPC 发布1.0 版本&#xff0c;代表着gRPC 已经正式进入稳定阶段。 今天我们就来学习gRPC C# 。而且目前也已经支持.NET Core 可以实现完美跨平台。 传统的.NET 可以通过Mono 来实现跨平台调用。 GitHub&#xff1a; https://github.com/grpc/grpc gRPC 简单介绍&#x…

Java日期及时间库插件 -- Joda Time.

转载自 Java日期及时间库插件 -- Joda Time.来到新公司工作也有一个多月了, 陆陆续续做了一些简单的项目. 今天做一个新东西的时候发现了 Joda Time的这个东西, 因为以前用的都是JDK原生的时间处理API, 大家都知道Java原生的时间处理的API一直都是不太好用, 所以这个有必要去…

电商校招指导

https://www.imooc.com/article/19998 https://www.imooc.com/article/18998 鼓励大家多总结 有道笔记可以记录下来 多年总结的 平时要多总结 https://www.imooc.com/article/19094 温馨tips&#xff1a; 校招的要求会比社招低很多&#xff0c;大家要把握好机会。因为校招…

大咖开讲:一小时学会.NET MVC开发的那些事儿

许多ASP.NET开发人员开始接触MVC认为MVC与ASP.NET完全没有关系&#xff0c;是一个全新的Web开发&#xff0c;事实上ASP.NET是创建WEB应用的框架&#xff0c;而MVC是能够用更好的方法来组织并管理代码的一种更高级架构体系。我们可将原来的ASP.NET称为ASP.NET Webform&#xff0…

HashMap的实现原理及其特点

HashMap的实现原理及其特点 2018年03月15日 20:43:08 阅读数&#xff1a;11045更多 个人分类&#xff1a; Java基础知识点 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/lovewebeye/article/details/79573702 1) Hash…

重写equals就必须重写hashCode的原理分析

转载自 重写equals就必须重写hashCode的原理分析因为最近在整理Java集合的源码&#xff0c; 所以今天再来谈谈这个古老的话题&#xff0c;因为后面讲HashMap会用到这个知识点&#xff0c; 所以重新梳理下。如果不被重写&#xff08;原生Object&#xff09;的hashCode和equals是…

mysql unique count_MySQL - Count Number of Unique Values

问题If I have three columns:orderNumber, name, emailand I would like to count how many unique emails are in the table how would I go about doing so?A statement like:SELECT count(email) FROM ordersgives me the total count.I tried SELECT DISTINCT count(emai…

如何在 ASP.NET MVC 中集成 AngularJS(2)

在如何在 ASP.NET MVC 中集成 AngularJS(1)中&#xff0c;我们介绍了 ASP.NET MVC 捆绑和压缩、应用程序版本自动刷新和工程构建等内容。 下面介绍如何在 ASP.NET MVC 中集成 AngularJS 的第二部分。 ASP.NET 捆绑和压缩 CSS 和 JavaScript 的捆绑与压缩功能是 ASP.NET MVC 最流…

bean交个spring和new比较区别

在spring的配置文件中我们要使用DataSource这个对吧 这个bean将会被多个bean引用 通过ref"dateSource"这个引用 当我们要修改这个只要修改引用就好了 不需要修改很多了 主要是解耦 比如你有一个A类 在好几个类里边要调用到A的方法 new的话就要在每个类里都new…

什么是中间件

转载自 什么是中间件什么是中间件&#xff1f; 中间件就是程序中可织入的&#xff0c;可重用的&#xff0c;与业务逻辑无关的各种组件。中间件&#xff08; middleware &#xff09;是基础软件的一大类&#xff0c;属于可复用软件的范畴。顾名思义&#xff0c;中 间件处于操作…

guid判断是否有效_让我们一起啃算法----有效的括号

有效括号&#xff08;Valid-Parentheses&#xff09;题干如下&#xff1a;给定一个只包括 ‘(‘&#xff0c;’)’&#xff0c;’{‘&#xff0c;’}’&#xff0c;’[‘&#xff0c;’]’ 的字符串&#xff0c;判断字符串是否有效。有效字符串需满足&#xff1a;1.左括号必须用…

小白科普:从输入网址到最后浏览器呈现页面内容,中间发生了什么?

转载自 小白科普&#xff1a;从输入网址到最后浏览器呈现页面内容&#xff0c;中间发生了什么&#xff1f; 1、前言 这篇文章是应网友之邀所写&#xff0c;主要描述一下我们访问网站时&#xff0c; 从输入网址到最后浏览器呈现内容&#xff0c;中间发生了什么。 之前写过两…

面试官角度的JVM面试

一个面试官对JVM面试问题的分析 2017年02月19日 21:51:34 阅读数&#xff1a;18135 标签&#xff1a; 面试官JVM面试问题分析 更多 个人分类&#xff1a; JVM 这个帖子的背景是今晚看到je上这张贴&#xff1a;http://www.iteye.com/topic/715256&#xff0c;心血来潮写下的文…