日期:2014-05-18  浏览次数:20715 次

分页查询,什么样的SQL查询速度最快
table   表中有唯一主键   DUNO;
现为实现分页查询方式,有两个sql待选:
1.
SELECT   TOP   100   *
FROM   tab
WHERE   DUNO> (SELECT     max(A.DUNO)
FROM   (select   top   10000   *   from   tab   where   DUNO < '2 '   order   by   DUNO)   A
)
ORDER   BY   DUNO
2.
SELECT   *
FROM   tab
WHERE   DUNO> (SELECT     MAX(A.DUNO)
FROM   (select   top   10000   *   from   tab   where   DUNO < '2 '   order   by   DUNO)   A
)
AND   DUNO <(SELECT     MAX(A.DUNO)
FROM   (select   top   10101   *   from   tab   where   DUNO < '2 '   order   by   DUNO)   A
)


请问哪一种查询速度最快?
若考虑移植性问题,应如何实现?
是否有其它更高效的方式?

------解决方案--------------------
http://community.csdn.net/Expert/topic/4986/4986911.xml?temp=.9076959


有你想要的
------解决方案--------------------
CREATE PROC SP_FY
(
@PageCount INT, --第N页
@PageSize INT --每页行数
)
AS
DECLARE @sql NVARCHAR(4000),--查询字符串
@PC INT, --PAGE COUNT
@APC INT, --ALL PAGE COUNT
@P1 INT, --P1是游标的id
@RowCount INT

SELECT @sql= '查询语句 '
print @sql
EXEC SP_CURSOROPEN @P1 OUTPUT,@sql,@scrollopt=1,@ccopt=1,@RowCount=@RowCount OUTPUT
SELECT @PC=@PageCount,@APC =CEILING(1.0*@RowCount/@PageSize)
SELECT @PageCount=(@PageCount-1)*@PageSize+1
EXEC SP_CURSORFETCH @P1,16,@PageCount,@PageSize
EXEC SP_CURSORCLOSE @P1
SELECT @RowCount AS 'ROWCOUNT ',@APC AS 'ALLPAGECOUNT ',@PC AS 'PAGECOUNT '

GO


现在流行这个
------解决方案--------------------
http://blog.csdn.net/dutguoyi/archive/2006/01/10/575617.aspx
讲了很多种方法,都很有特色,可以看看.

如果就你的题目,还是前面那种效率高点.
------解决方案--------------------
SP_CURSOROPEN的使用方法,在帮助中找不到, 在baidu找了一下,有相关的英文说明,不错,又学到了一些未知的东西。
------解决方案--------------------
sql 2005 有新增的 (更简单)

排名函数为分区中的每一行返回一个排名值。根据所用的函数,某些行可能与其他行接收到相同的值。排名函数具有不确定性。

Transact-SQL 提供下列排名函数:

RANK
NTILE

DENSE_RANK
ROW_NUMBER

用 ROW_NUMBER 可以 很容易 分页


USE AdventureWorks;
GO
WITH OrderedOrders AS
(SELECT SalesOrderID, OrderDate,
ROW_NUMBER() OVER (order by OrderDate)as RowNumber
FROM Sales.SalesOrderHeader )
SELECT *
FROM OrderedOrders
WHERE RowNumber between 50 and 60;


------解决方案--------------------
楼上的不错,mark下