分页查询,什么样的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下