Sqlserver數據庫分頁查詢一直是Sqlserver的短板,閑來無事,想出幾種方法,假設有表ARTICLE,字段ID、YEAR...(其他省略),數據53210條(客戶真實數據,量不大),分頁查詢每頁30條,查詢第1500頁(即第45001-45030條數據),字段ID聚集索引,YEAR無索引,Sqlser
Sqlserver數據庫分頁查詢一直是Sqlserver的短板,閑來無事,想出幾種方法,假設有表ARTICLE,字段ID、YEAR...(其他省略),數據53210條(客戶真實數據,量不大),香港服務器,分頁查詢每頁30條,香港虛擬主機,查詢第1500頁(即第45001-45030條數據),字段ID聚集索引,YEAR無索引,Sqlserver版本:2008R2
第一種方案、最簡單、普通的方法:
ARTICLE ID , ID ,ID DESC
平均查詢100次所需時間:45s
第二種方案:
(
(ARTICLE , ID , f.ID ,s.ID DESC
平均查詢100次所需時間:138S
第三種方案:
ARTICLE w1, ( ID FROM ( ID, , ID DESC ) w , w.ID ASC ) w2 , w1.ID DESC
平均查詢100次所需時間:21S
第四種方案:
ARTICLE w1 WHERE ID in ( ID FROM ( ID, , ID DESC ) w , w.ID ASC ) , w1.ID DESC
平均查詢100次所需時間:20S
第五種方案:
row_number() , ID w2.n ASC
平均查詢100次所需時間:15S
查詢第1000-1030條記錄
第一種方案:
ARTICLE ID , ID ,ID DESC
平均查詢100次所需時間:80s
第二種方案:
(
(ARTICLE , ID , f.ID ,s.ID DESC
平均查詢100次所需時間:30S
第三種方案:
ARTICLE w1, ( ID FROM ( ID, , ID DESC ) w , w.ID ASC ) w2 , w1.ID DESC
平均查詢100次所需時間:12S
第四種方案:
ARTICLE w1 WHERE ID in ( ID FROM ( ID, , ID DESC ) w , w.ID ASC ) , w1.ID DESC
平均查詢100次所需時間:13S
第五種方案:
row_number() , ID w2.n ASC
平均查詢100次所需時間:14S
由此可見在查詢頁數靠前時,效率3>4>5>2>1,頁碼靠后時5>4>3>1>2,再根據用戶習慣,一般用戶的檢索只看最前面幾頁,因此選擇3 4 5方案均可,若綜合考慮方案5是最好的選擇,但是要注意SQL2000不支持row_number()函數,由于時間和條件的限制沒有做更深入、范圍更廣的測試,有興趣的可以仔細研究下。
以下是根據第四種方案編寫的一個分頁存儲過程:
dbo.sysobjects ) ) = 1) ..output, output, (((((, , NOCOUNT (3000) (100) (100) (4000) (4000) () (((,'') (,) ()SP_EXECUTESQL , @RCount OUTPUT,@PCount OUTPUT (()(()/@sys_PageSize) (()) (@sql) Exec(@sql) GO
,虛擬主機聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com