国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
SqlServer 數(shù)據(jù)分頁(yè)的存儲(chǔ)過(guò)程--我的窩

SqlServer 數(shù)據(jù)分頁(yè)的存儲(chǔ)過(guò)程- -

                                      

SQL Server 存儲(chǔ)過(guò)程的分頁(yè),這個(gè)問(wèn)題已經(jīng)討論過(guò)幾年了,很多朋友在問(wèn)我,所以在此發(fā)表一下我的觀點(diǎn)
建立表:

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
 

插入數(shù)據(jù):(2萬(wàn)條,用更多的數(shù)據(jù)測(cè)試會(huì)明顯一些)
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 

-------------------------------------

分頁(yè)方案一:(利用Not InSELECT TOP分頁(yè))
語(yǔ)句形式:

SELECT TOP 10 *
FROM TestTable
WHERE (ID NOT IN
          (SELECT TOP 20 id
         FROM TestTable
         ORDER BY id))
ORDER BY ID


SELECT TOP
頁(yè)大小 *
FROM TestTable
WHERE (ID NOT IN
          (SELECT TOP
頁(yè)大小*頁(yè)數(shù)
id
         FROM

         ORDER BY id))
ORDER BY ID

-------------------------------------

分頁(yè)方案二:(利用ID大于多少和SELECT TOP分頁(yè))
語(yǔ)句形式:
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
頁(yè)大小 *
FROM TestTable
WHERE (ID >
          (SELECT MAX(id)
         FROM (SELECT TOP
頁(yè)大小*頁(yè)數(shù)
id
                 FROM

                 ORDER BY id) AS T))
ORDER BY ID

-------------------------------------

分頁(yè)方案三:(利用SQL的游標(biāo)存儲(chǔ)過(guò)程分頁(yè))
create  procedure XiaoZhengGe
@
sqlstr nvarchar(4000), --
查詢字符
@currentpage int, --
N頁(yè)
@pagesize int --
每頁(yè)行數(shù)
as
set nocount on
declare @P1 int, --P1
是游標(biāo)的id
 @rowcount int
exec sp_cursoropen @P1 output,@
sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
select ceiling(
1.0*@rowcount/@pagesize) as 總頁(yè)數(shù)--,@rowcount as 總行數(shù),@currentpage as 當(dāng)前頁(yè) 
set @currentpage=(@currentpage-1)*@pagesize+1
exec sp_cursorfetch @P1,16,@currentpage,@pagesize
exec sp_cursorclose @P1
set nocount off

其它的方案:如果沒(méi)有主鍵,可以用臨時(shí)表,也可以用方案三做,但是效率會(huì)低。
建議優(yōu)化的時(shí)候,加上主鍵和索引,查詢效率會(huì)提高。

通過(guò)SQL 查詢分析器,顯示比較:我的結(jié)論是:
分頁(yè)方案二:(利用ID大于多少和SELECT TOP分頁(yè))效率最高,需要拼接SQL語(yǔ)句

分頁(yè)方案一:(利用Not InSELECT TOP分頁(yè))   效率次之,需要拼接SQL語(yǔ)句
分頁(yè)方案三:(利用SQL的游標(biāo)存儲(chǔ)過(guò)程分頁(yè))    效率最差,但是最為通用

在實(shí)際情況中,要具體分析。

 

以下是另一個(gè)存儲(chǔ)過(guò)程的例子.

通常用普通的SQL語(yǔ)句查詢數(shù)據(jù),在數(shù)據(jù)量少的情況下速度上沒(méi)什么感覺(jué),一旦數(shù)居量很大之后,速度會(huì)明顯變慢,因?yàn)榇罅康臄?shù)據(jù)在網(wǎng)絡(luò)中傳輸會(huì)花掉不少的時(shí)間,如果使用了分頁(yè)查詢數(shù)據(jù),只反回有用的數(shù)據(jù),把不需要的數(shù)據(jù)排除后,傳輸速度會(huì)快很多,如下是一個(gè)SQL分頁(yè)的存儲(chǔ)過(guò)程,本過(guò)程是以SQL自帶的 Northwind 數(shù)據(jù)庫(kù)為例寫(xiě)的,可以根據(jù)自已的需要隨意更改

CREATE
PROCEDURE [GetCustomersDataPage]
@PageIndex
INT, --頁(yè)號(hào)

@PageSize
INT, --頁(yè)數(shù)
@RecordCount
INT OUT, --記錄數(shù)
@PageCount
INT OUT --頁(yè)數(shù)
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

 

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
[百萬(wàn)級(jí)]通用分頁(yè)存儲(chǔ)過(guò)程.[千萬(wàn)級(jí)]實(shí)現(xiàn)千萬(wàn)級(jí)數(shù)據(jù)的分頁(yè)顯示! - SQL Server - 數(shù)據(jù)庫(kù)開(kāi)發(fā) - 大家論壇 - Powered by Discuz!
sql 優(yōu)化之:實(shí)現(xiàn)小數(shù)據(jù)量和海量數(shù)據(jù)的通用分頁(yè)顯示存儲(chǔ)過(guò)程(系列四)
分頁(yè)存儲(chǔ)過(guò)程sql2000,支持 多字段 排序
Mysql存儲(chǔ)過(guò)程(三)
分頁(yè)的存儲(chǔ)過(guò)程方法
關(guān)于SQL的over partition by 開(kāi)窗語(yǔ)句在分頁(yè)和統(tǒng)計(jì)中的使用總結(jié)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服