CREATE TABLE [TestTable] (
?[ID] [int] IDENTITY (1, 1) NOT NULL ,
?[FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
?[LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
?[Country] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
?[Note] [nvarchar] (2000) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
?
插入數據:
(2
萬條,用更多的數據測試會明顯一些
)
SET IDENTITY_INSERT TestTable ON
declare @i int
set @i=1
while @i<=20000
begin
??? insert into TestTable([id], FirstName, LastName, Country,Note) values(@i, 'FirstName_XXX','LastName_XXX','Country_XXX','Note_XXX')
??? set @i=@i+1
end
SET IDENTITY_INSERT TestTable OFF ?
-------------------------------------
分頁方案一:
(
利用
Not In
和
SELECT TOP
分頁
)
語句形式:
SELECT TOP 10 *
FROM TestTable
WHERE (ID NOT IN
????????? (SELECT TOP 20 id
???????? FROM TestTable
???????? ORDER BY id))
ORDER BY ID
SELECT TOP
頁大小
*
FROM TestTable
WHERE (ID NOT IN
????????? (SELECT TOP
頁大小
*
頁數
id
???????? FROM
表
???????? ORDER BY id))
ORDER BY ID
-------------------------------------
分頁方案二:
(
利用
ID
大于多少和
SELECT TOP
分頁)
語句形式:
SELECT TOP 10 *
FROM TestTable
WHERE (ID >
????????? (SELECT MAX(id)
???????? FROM (SELECT TOP 20 id
???????????????? FROM TestTable
???????????????? ORDER BY id) AS T))
ORDER BY ID
SELECT TOP
頁大小
*
FROM TestTable
WHERE (ID >
????????? (SELECT MAX(id)
???????? FROM (SELECT TOP
頁大小
*
頁數
id
???????????????? FROM
表
???????????????? ORDER BY id) AS T))
ORDER BY ID
-------------------------------------
分頁方案三:
(
利用
SQL
的游標存儲過程分頁
)
create? procedure XiaoZhengGe
@
sql
str nvarchar(4000), --
查詢
字符
串
@currentpage int,?--
第
N
頁
@pagesize int?--
每頁行數
as
set nocount on
declare @P1 int,?--P1
是游標的
id
?@rowcount int
exec sp_cursoropen @P1 output,@
sql
str,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
select ceiling(
1.0*@rowcount/@pagesize
) as
總頁數
--,@rowcount as
總行數
,@currentpage as
當前頁
?
set @currentpage=(@currentpage-1)*@pagesize+1
exec sp_cursorfetch @P1,16,@currentpage,@pagesize
exec sp_cursorclose @P1
set nocount off
其它的方案:如果沒有主鍵,可以用臨時表,也可以用方案三做,但是效率會低。
建議優化的時候,加上主鍵和索引,查詢效率會提高。
通過
SQL
查詢分析器,顯示比較:我的結論是
:
分頁方案二:
(
利用
ID
大于多少和
SELECT TOP
分頁)效率最高,需要拼接
SQL
語句
分頁方案一:
(
利用
Not In
和
SELECT TOP
分頁
)??
效率次之,需要拼接
SQL
語句
分頁方案三:
(
利用
SQL
的游標存儲過程分頁
)???
效率最差,但是最為通用
在實際情況中,要具體分析。
?
以下是另一個存儲過程的例子.
通常用普通的
SQL
語句查詢數據,在數據量少的情況下速度上沒什么感覺,一旦數居量很大之后,速度會明顯變慢,因為大量的數據在網絡中傳輸會花掉不少的時間,如果使用了分頁查詢數據,只反回有用的數據,把不需要的數據排除后,傳輸速度會快很多,如下是一個
SQL
分頁的存儲過程,本過程是以
SQL
自帶的
Northwind
數據庫為例寫的,可以根據自已的需要隨意更改
CREATE
PROCEDURE
[GetCustomersDataPage]
@PageIndex
INT
,
--
頁號
@PageSize
INT
,
--
頁數
@RecordCount
INT
OUT
,
--
記錄數
@PageCount
INT
OUT
--
頁數
AS
SELECT
@RecordCount =
COUNT
(*)
FROM
Customers
SET
@PageCount =
CEILING
(@RecordCount * 1.0 / @PageSize)
DECLARE
@SQLSTR
NVARCHAR
(1000)
IF
@PageIndex = 0
OR
@PageCount <= 1
SET
@SQLSTR =
'SELECT
TOP
'
+
STR
( @PageSize )+
' CustomerID, CompanyName,Address,Phone FROM Customers ORDER BY CustomerID DESC'
ELSE
IF
@PageIndex = @PageCount - 1
SET
@SQLSTR =
' SELECT * FROM ( SELECT
TOP
'
+
STR
( @RecordCount - @PageSize * @PageIndex )+
' CustomerID, CompanyName,Address,Phone FROM Customers ORDER BY CustomerID ASC ) TempTable ORDER BY CustomerID DESC'
ELSE
SET
@SQLSTR =
' SELECT
TOP
'
+
STR
( @PageSize )+
' * FROM ( SELECT
TOP
'
+
STR
( @RecordCount - @PageSize * @PageIndex )+
' CustomerID, CompanyName,Address,Phone FROM Customers ORDER BY CustomerID ASC ) TempTable ORDER BY CustomerID DESC'
EXEC
(@SQLSTR)
GO
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
