国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQL Server > 正文

SQL Server 存儲過程的分頁方案比拼

2024-08-31 00:48:17
字體:
來源:轉載
供稿:網友

sql server 存儲過程的分頁,這個問題已經討論過幾年了,很多朋友在問我,所以在此發表一下我的觀點
建立表:

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 @[email protected]+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
@sqlstr nvarchar(4000), --查詢字符串
@currentpage int, --第n頁
@pagesize int --每頁行數
as
set nocount on
declare @p1 int, --p1是游標的id
 @rowcount int
exec sp_cursoropen @p1 output,@sqlstr,@scrollopt=1,@ccopt=1,@[email protected] 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的游標存儲過程分頁)    效率最差,但是最為通用

在實際情況中,要具體分析。


更多的討論見:
http://community.csdn.net/expert/topic/3292/3292678.xml?temp=.1621515


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 泰宁县| 沙洋县| 藁城市| 呼伦贝尔市| 桃园县| 延长县| 射阳县| 洛川县| 延川县| 合水县| 辰溪县| 大渡口区| 山阴县| 黄梅县| 集贤县| 卢龙县| 汽车| 玉龙| 高邮市| 昭平县| 嘉义市| 吕梁市| 巴东县| 贵德县| 任丘市| 桃园市| 永德县| 旅游| 美姑县| 城步| 牙克石市| 汉阴县| 银川市| 凤台县| 交口县| 芜湖市| 陵川县| 闻喜县| 囊谦县| 嵩明县| 蓬溪县|