日期:2014-05-17  浏览次数:20484 次

请教T-Sql分页

-----以下两种分页方式结果是一样的,第一种有什么优势?很明显它要扫描表两次。

CREATE INDEX idx_od_oid_i_cid_eid  ON Sales.Orders(orderdate, orderid) INCLUDE(custid, empid);
--orderid是sales.Orders的主键,排序列是orderdate,决胜属性是orderid
---------------------------------
CREATE PROC dbo.GetNextPage
  @anchor AS INT, -- 上次分页后最后一行的主键
  @n AS INT = 10
AS
SELECT TOP (@n) O.orderid, O.orderdate, O.custid, O.empid
FROM Sales.Orders AS O
  JOIN Sales.Orders AS A
    ON A.orderid = @anchor
    AND (O.orderdate >= A.orderdate
         And (O.orderdate > A.orderdate --
             Or O.orderid > A.orderid))
ORDER BY O.orderdate, O.orderid;
GO
-------------------------
Alter PROC dbo.GetNextPage
  @anchor AS INT, -- key of last row in prev page
  @n AS INT = 10
AS
SELECT TOP (@n) O.orderid, O.orderdate, O.custid, O.empid
FROM Sales.Orders AS O
Where 
     O.orderid > @anchor
ORDER BY O.orderdate, O.orderid;
GO
--运行这个测试,测试结果是一样的。
EXEC dbo.GetNextPage @anchor = 10257;

请问,第一种分页到底有什么好的?
SQL 分页

------解决方案--------------------
引用:
Quote: 引用:

分页的order by不一定正好都是 主键 的


引用:
分页的order by不一定正好都是 主键 的

不太懂?能否更详细的讲解一下?帖中是没有根据主键order by。



比如主键是id
而分页可能需要按用户名排序,或按日期时间排序,这些可能都是存在的

刚刚仔细看了一下sql,的确没按主键排序
第二种做法好像不对的:
会让id大但时间小的记录(在以前的页面出现过)反复出现

------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

2005以上有比较简单的方式,用row_number(),如果是2005的话,就去网上搜一下,一大把

我看《技术内幕T-Sql查询》是用的第一种方法,所以觉得奇怪。
版主你怎么看?
你把语句放到同一个窗口,开启实际执行计划,然后一起执行,看看两者的百分比,一般来说,百分比较低的那个性能好

测试第二种快,第二种只有33%,版主你觉得《技术内幕T-Sql查询》的作者为什么会用第一种呢?
其实我都没看这套书,但是我觉得呢,即使是神级的书,也不可能总是什么都是最优的。或者他的写法在某一章中的知识点所需,所以这样写。也或者是对于某些数据和表结构,只有某种写法

版主能介绍几本书吗?版主是牛人。
我在看《SQLServer 2008 internal》、《SQLServer 2012 实施与管理 实战指南》、还有这本:http://download.csdn.net/detail/dba_huangzj/53218