[读书心得]资料分页的优化,以SQL 2012的 OFFSET-FETCH为例
这是我的文章备份,原始出处:[读书心得]资料分页的优化,以SQL 2012的 OFFSET-FETCH为例
http://www.dotblogs.com.tw/mis2000lab/archive/2015/04/10/sql_querying_paging_offset-fetch.aspx
这篇文章源自微软出版社(Microsoft Press)
2015年的新书 -- T-SQL Querying
- Published 3/6/2015
- 1st Edition
- 864 pages
- Book 978-0-7356-8504-8
- eBook 978-0-13-398664-8
微软网站已经公开了 这一章 的全文,请看
https://www.microsoftpressstore.com/articles/article.aspx?p=2314819&seqNum=1
第二页里面 介绍数据库分页的SQL指令,
包含 TOP、ROW_NUMBER(SQL 2005 起可用)、OFFSET-FETCH(SQL 2012 起可用)
因为我们公司都改成SQL 2012版了,所以我只摘录 OFFSET-FETCH的部分
====================================================================
SQL 2012起 多了OFFSET-FETCH的作法,
比起上述的TOP、ROW_NUMBER更简单而且更强。
底下是一般的作法(尚未优化),跟前面章节的范例雷同:
-- 批注:改良后的预存程序(尚未优化)。
CREATE PROC dbo.GetPage5
@pagenum AS BIGINT = 1,
@pagesize AS BIGINT = 25
AS
SELECT orderid, orderdate, custid, empid
FROM dbo.Orders
ORDER BY orderid
OFFSET (@pagenum - 1) * @pagesize ROWS FETCH NEXT @pagesize ROWS ONLY;
GO
-- 批注:执行这一段预存程序。
EXEC dbo.GetPage5 @pagenum = 1, @pagesize = 25;
EXEC dbo.GetPage5 @pagenum = 2, @pagesize = 25;
EXEC dbo.GetPage5 @pagenum = 3, @pagesize = 25;
下图是简单的解说,让您了解 OFFSET-FECTCH的用法
我们可以进一步修正如下,让搜寻的效能更好。
根据微软出版书籍所做的测试,在您阅览第一千页的数据时,下面的写法只需逻辑读取241次,
而上述的写法却要76,644次,效能大幅提升了。
-- 批注:改良后的预存程序(优化)。
CREATE PROC dbo.GetPage6
@pagenum AS BIGINT = 1,
@pagesize AS BIGINT = 25
AS
WITH K AS -- Define a table expression based on this query (call it K, for keys).
(
SELECT orderid
FROM dbo.Orders
ORDER BY orderid
OFFSET (@pagenum - 1) * @pagesize ROWS FETCH NEXT @pagesize ROWS ONLY
)
SELECT O.orderid, O.orderdate, O.custid, O.empid
FROM dbo.Orders AS O
INNER JOIN K
ON O.orderid = K.orderid
ORDER BY O.orderid;
GO
-- 批注:执行这一段预存程序。
EXEC dbo.GetPage6 @pagenum = 3, @pagesize = 25;
====================================================================
如果您想进一步了解里面的原理
就直接看微软公开的这一章吧,
共有六页,写得很详尽!
https://www.microsoftpressstore.com/articles/article.aspx?p=2314819&seqNum=1
本站已发表的相关文章 --
[ASP.NET 4.5 / VS 2012]GridView自定义分页的新属性,AllowCustomPaging与 VirtualItemCount
[.NET 4.5]GridView自定义分页的新属性,AllowCustomPaging与 VirtualItemCount #2 范例 - DataReader +数据库分页
这是我的文章备份,原始出处:[读书心得]资料分页的优化,以SQL 2012的 OFFSET-FETCH为例
http://www.dotblogs.com.tw/mis2000lab/archive/2015/04/10/sql_querying_paging_offset-fetch.aspx
[读书心得]资料分页的优化,以SQL 2012的 OFFSET-FETCH为例的更多相关文章
- SQL Server 2012使用Offset/Fetch Next实现分页
在Sql Server 2012之前,实现分页主要是使用ROW_NUMBER(),在SQL Server2012,可以使用Offset ...Rows Fetch Next ... Rows onl ...
- SQL Server 2012使用OFFSET/FETCH NEXT分页及性能测试
最近在网上看到不少文章介绍使用SQL Server 2012的新特性:OFFSET/FETCH NEXT 实现分页.多数文章都是引用或者翻译的这一篇<SQL Server 2012 - Serv ...
- SQL Server使用Offset/Fetch Next实现分页
T-SQL实现分页 ,查找指定范围内的数据 首先,正常的查询是这样的 使用分页后 select * from Products order by ProductID offset X rows fet ...
- sql 2012之后分页查询速度问题
一.SQL Server 2012使用OFFSET/FETCH NEXT分页,比SQL Server 2005/2008中的RowNumber()有显著改进.今天特地作了简单测试,现将过程分享如下: ...
- SQLServer · 最佳实践 · SQL Server 2012 使用OFFSET分页遇到的问题
1. 背景 最近有一个客户遇到一个奇怪的问题,以前使用ROW_NUMBER来分页结果是正确的,但是替换为SQL SERVER 2012的OFFSET...FETCH NEXT来分页出现了问题,因此,这 ...
- SQL Server 2012提供的OFFSET/FETCH NEXT与Row_Number()对比测试(转)
原文地址:http://www.cnblogs.com/downmoon/archive/2012/04/19/2456451.html 在<SQL Server 2012服务端使用OFFSET ...
- SQL Server 2012提供的OFFSET/FETCH NEXT与Row_Number()对比测试 [T]
SQL Server 2008中SQL应用系列--目录索引 前些天看到一篇文章<SQL Server 2012 - Server side paging demo using OFFSET/FE ...
- Sqlserver中分页,2012后支持offset + fetch,2012之前用rownum嵌套查询
今天发现原先用的sql offset fetch好用,换了一个DB就歇菜 歇菜截图 比较了一下,是数据库版本的问题 一个是13,一个是10 版本低的不支持用offset + fetch 进行分页,ms ...
- SQL Server ->> OFFSET & FETCH子句
SQL Server 2012引入OFFSET + FETCH字句.它俩出现在SELECT .... ORDER BY ...后面.作用是告诉SQL Server在结果集中忽略前N行然后取前M行出来. ...
随机推荐
- JavaScriptResult用法
写MVC项目的时候,一开始就遇到返回脚本无法执行的情况,查阅博客园中老鸟的各种文章,最后没有得出个所以然,没办法,找项目经理实地讨论. public JavaScriptResult Hello() ...
- 《Code Complete》ch.7 高质量的子程序
WHAT? 子程序(routines)是为实现一个特定目的而编写的可被调用的方法或过程.在C++中是函数(function),在Java中是方法(method),在VB中是函数过程(function ...
- Kung fu
1. originPeople in Primitive society(原始社会)in order to survive,they have to hunt for food efficiently ...
- SQL必知必会笔记2
15. 插入数据 1). 数据插入 INSERT 用来将行插入到数据库表中,插入的方式有几种: (1)插入完整的行: INSERT INTO Customers VALUES( '1000000006 ...
- ubuntu 开发环境搭建 lisp gcc python perl mysql
一: lisp sudo apt-get install emacs sudo apt-get install sbcl sudo apt-get install slime emacs里 Alt+x ...
- [drp 7]转发和重定向的区别
导读:类似于response.sendRedirect(request.getContextPath()+"/servlet/item/SearchItemServlet");和r ...
- solr5.5教程-tomcat布署
tomcat和solr在各自官网下载,版本如下: tomcat版本:8.0.24 solr版本:5.5.0 1.solr解压后,目录结构如下: 2.tomcat的webapps里新建solr目录, 把 ...
- 006NFS与TFTP服务器
1.交叉开发:嵌入式系统开发多采用交叉开发模式,其中产生嵌入式软件的平台称为宿主机,通常为PC电脑,运行嵌入式软件的平台称为目标机.宿主机一般通过网络,USB,JTAG等方式将软件下载到目标机. 2. ...
- 004远程登录Linux系统
通过windows主机远程登录Linux主机 前提一:从windows能ping通Linux 前提二:关闭Linux防火墙,运行命令:/etc/init.d/iptables stop (1)使用Pu ...
- 1.5如何学习Linux驱动开发
1.准备一个自己熟悉的Linux操作系统,用于开发和测试Linux驱动,建议使用Ubuntu Linux 10.04及以上版本: 2.准备一块开发板,建议采用基于ARM11的开发板: 3.学习GUN ...