[读书心得]资料分页的优化,以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指令,

包含 TOPROW_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

本站已发表的相关文章 --

上集 Ch 14-4 撰写ADO.NET DataReader的分页程序#1(搭配SQL指令 ROW_NUMBER)

上集 Ch 14-4 撰写ADO.NET DataReader的分页程序#3(搭配SQL 2012指令 OFFSET...FETCH)

[ASP.NET 4.5 / VS 2012]GridView自定义分页的新属性,AllowCustomPaging与 VirtualItemCount

[.NET 4.5]GridView自定义分页的新属性,AllowCustomPaging与 VirtualItemCount #2 范例 - DataReader +数据库分页

Model Binding入门、简介、初试身手 #2 -- Web Form分页与 IQueryable (不使用EF)

这是我的文章备份,原始出处:[读书心得]资料分页的优化,以SQL 2012的 OFFSET-FETCH为例

http://www.dotblogs.com.tw/mis2000lab/archive/2015/04/10/sql_querying_paging_offset-fetch.aspx

时间: 2024-08-09 23:45:43

[读书心得]资料分页的优化,以SQL 2012的 OFFSET-FETCH为例的相关文章

SQL Server 2012使用Offset/Fetch Next实现分页

在Sql Server 2012之前,实现分页主要是使用ROW_NUMBER(),在SQL Server2012,可以使用Offset ...Rows  Fetch Next ... Rows only的方式去实现分页数据查询. select [column1] ,[column2] ... ,[columnN] from [tableName] order by [columnM] offset (pageIndex-1)*pageSize rows fetch next pageSize r

SQL Server ->> OFFSET & FETCH子句

SQL Server 2012引入OFFSET + FETCH字句.它俩出现在SELECT .... ORDER BY ...后面.作用是告诉SQL Server在结果集中忽略前N行然后取前M行出来. 比如 SELECT NUM FROM dbo.Numbers ORDER BY Num OFFSET 100 ROWS FETCH NEXT 5 ROWS ONLY 主要要观察下性能如何,执行计划.实际行数为105.没有出现不必要的行扫描.

MySQL单表百万数据记录分页性能优化

原文地址:http://www.cnblogs.com/lyroge/p/3837886.html MySQL单表百万数据记录分页性能优化 背景: 自己的一个网站,由于单表的数据记录高达了一百万条,造成数据访问很慢,Google分析的后台经常报告超时,尤其是页码大的页面更是慢的不行. 测试环境: 先让我们熟悉下基本的sql语句,来查看下我们将要测试表的基本信息 use infomation_schemaSELECT * FROM TABLES WHERE TABLE_SCHEMA = 'dbna

深度探索C++对象模型的读书心得

参考:深度探索C++对象模型 (stanley B.Lippman著 侯捷翻译) 1. Page9 : C++对象模型,说明每一个类仅有一个虚函数表Vtbl,而类的每一个对象都有指向其表的指针. 2. Page30:引用也需要与一个指针(大小为4BYTE)相同的空间. 3. Page28: 指针类型会教导编译器如何解释某个特定地址中的内存内容及大小. 4. Page39: explicit关键字能够制止"单一参数的constructor被当做一个Conversion运算符" 5. Pa

(3)mysql优化之sql语句优化

概述 该篇主要介绍一些常用的sql优化技巧 sql优化 1.select * from table_name where; 建议将*改为需要的列.这对速度不会有明显的影响,主要考虑节省内存. 2.like语句 一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题.like "%aaa%" 不会使用索引而like "aaa%"可以使用索引. 3.不要在列上进行运算,无法运用索引 select * from users where YEAR(addda

mysql分页limit 优化

mysql的分页比较简单,只需要limit offset,length就可以获取数据了,但是当offset和length比较大的时候,mysql明显性能下降 * 1.子查询优化法 先找出第一条数据,然后大于等于这条数据的id就是要获取的数 缺点:数据必须是连续的,可以说不能有where条件,where条件会筛选数据,导致数据失去连续性 实验下 Sql代码  mysql> set profiling=1 Query OK, 0 rows affected (0.00 sec 3.4. mysql>

SQL Server数据库性能优化之SQL语句篇(转载)

SQL Server数据库性能优化之SQL语句篇 原文地址:http://www.blogjava.net/allen-zhe/archive/2010/07/23/326927.html 期项目需要,做了一段时间的SQL Server性能优化,遇到了一些问题,也积累了一些经验,现总结一下,与君共享.SQL Server性能优化涉及到许多方面,如良好的系统和数据库设计,优质的SQL编写,合适的数据表索引设计,甚至各种硬件因素:网络性能.服务器的性能.操作系统的性能,甚至网卡.交换机等.这篇文章主

mysql优化-数据库优化、SQL优化

我有一张表w1000,里面有1000万条数据,这张表结构如下:CREATE TABLE `w1000` ( `id` varchar(36) NOT NULL, `name` varchar(10) DEFAULT NULL, `age` int(3) DEFAULT NULL, `money` double(8,2) DEFAULT NULL, `address` varchar(100) DEFAULT NULL, `create_date` datetime(3) DEFAULT NULL

ORACLE性能优化之SQL语句优化

版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 操作环境:AIX +11g+PLSQL 包含以下内容: 1.  SQL语句执行过程 2.  优化器及执行计划 3.  合理应用Hints 4.  索引及应用实例 5.   其他优化技术及应用 1.SQL语句执行过程 1.1 SQL语句的执行步骤 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义. 2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限. 3)视图转换,将涉及视图的查询语句转