国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫 - Sql Server - sqlserver 高性能分頁實(shí)現(xiàn)分析

sqlserver 高性能分頁實(shí)現(xiàn)分析

2019-12-03 14:49MSSQL教程網(wǎng) Sql Server

SQLServer中有一個(gè)Set Rowcount的的設(shè)置,它的意思是使命令的處理在響應(yīng)指定的行數(shù)之后停止處理命令,利用這個(gè)特點(diǎn),我們可以借用它來在一個(gè)千萬行級(jí)數(shù)據(jù)表中實(shí)現(xiàn)高性能分頁查詢。

先來說說實(shí)現(xiàn)方式: 
1、我們來假定Table中有一個(gè)已經(jīng)建立了索引的主鍵字段ID(整數(shù)型),我們將按照這個(gè)字段來取數(shù)據(jù)進(jìn)行分頁。 
2、頁的大小我們放在@PageSize中 
3、當(dāng)前頁號(hào)我們放在@CurrentPage中 
4、如何讓記錄指針快速滾動(dòng)到我們要取的數(shù)據(jù)開頭的那一行呢,這是關(guān)鍵所在!有了Set RowCount,我們就很容易實(shí)現(xiàn)了。 
5、如果我們成功地滾動(dòng)記錄指針到我們要取的數(shù)據(jù)的開頭的那一行,然后我們把那一行的記錄的ID字段的值記錄下來,那么,利用Top和條件,我們就很容易的得到指定頁的數(shù)據(jù)了。當(dāng)然,有了Set RowCount,我們難道還用Top么? 
看看Set Rowcount怎么來幫我們的忙吧: 

復(fù)制代碼代碼如下:


Declare @ID int 
Declare @MoveRecords int 

--@CurrentPage和@PageSize是傳入?yún)?shù) 
Set @MoveRecords=@CurrentPage * @PageSize+1 

--下面兩行實(shí)現(xiàn)快速滾動(dòng)到我們要取的數(shù)據(jù)的行,并把ID記錄下來 
Set Rowcount @MoveRecords 
Select @ID=ID from Table1 Order by ID 

Set Rowcount @PageSize 
--最恨為了減少麻煩使用*了,但是在這里為了說明方便,暫時(shí)用一下 
Select * From Table1 Where ID>=@ID Order By ID 
Set Rowcount 0 


大家可以試試看,在一個(gè)1千W記錄的表里面,一下子方翻頁到第100頁(每頁100條),看看有多快! 

因?yàn)槠匠?倒序 排的比較多,上面也很好改。 
將 Order by ID 改成 Order by ID DESC 
將 Where ID>=@ID Order By ID 改成 Where ID<=@ID Order By ID DESC 
就可以了. 

復(fù)制代碼代碼如下:


set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
GO 
Create PROCEDURE [dbo].[Tag_Page_Name_Select] 
-- 傳入最大顯示紀(jì)錄數(shù)和當(dāng)前頁碼 
@MaxPageSize int, 
@PageNum int, 
-- 設(shè)置一個(gè)輸出參數(shù)返回總紀(jì)錄數(shù)供分頁列表使用 
@Count int output 
AS 
BEGIN 
SET NOCOUNT ON; 

DECLARE 
-- 定義排序名稱參數(shù) 
@Name nvarchar(50), 
-- 定義游標(biāo)位置 
@Cursor int 
-- 首先得到紀(jì)錄總數(shù) 
Select @Count = count(tag_Name) 
FROM [viewdatabase0716].[dbo].[view_tag]; 
-- 定義游標(biāo)需要開始的位置 
Set @Cursor = @MaxPageSize*(@PageNum-1)+1 
-- 如果游標(biāo)大于紀(jì)錄總數(shù)將游標(biāo)放到最后一頁開始的位置 
IF @Cursor > @Count 
BEGIN 
-- 如果最后一頁與最大每次紀(jì)錄數(shù)相等,返回最后整頁 
IF @Count % @MaxPageSize = 0 
BEGIN 
IF @Cursor > @MaxPageSize 
Set @Cursor = @Count - @MaxPageSize + 1 
ELSE 
Set @Cursor = 1 
END 
-- 否則返回最后一頁剩下的紀(jì)錄 
ELSE 
Set @Cursor = @Count - (@Count % @MaxPageSize) + 1 
END 
-- 將指針指到該頁開始 
Set Rowcount @Cursor 
-- 得到紀(jì)錄開始的位置 
Select @Name = tag_Name 
FROM [viewdatabase0716].[dbo].[view_tag] 
orDER BY tag_Name; 
-- 設(shè)置開始位置 
Set Rowcount @MaxPageSize 
-- 得到該頁紀(jì)錄 
Select * 
From [viewdatabase0716].[dbo].[view_tag] 
Where tag_Name >= @Name 
order By tag_Name 

Set Rowcount 0 
END 



分頁控件 

復(fù)制代碼代碼如下:


using System.Data; 
using System.Configuration; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Web.UI.HtmlControls; 
using System.Text; 

/// <summary> 
/// 擴(kuò)展連接字符串 
/// </summary> 
public class ExStringBuilder 

private StringBuilder InsertString; 
private StringBuilder PageString; 
private int PrivatePageNum = 1; 
private int PrivateMaxPageSize = 25; 
private int PrivateMaxPages = 10; 
private int PrivateCount; 
private int PrivateAllPage; 
public ExStringBuilder() 

InsertString = new StringBuilder(""); 

/// <summary> 
/// 得到生成的HTML 
/// </summary> 
public string GetHtml 

get 

return InsertString.ToString(); 


/// <summary> 
/// 得到生成的分頁HTML 
/// </summary> 
public string GetPageHtml 

get 

return PageString.ToString(); 


/// <summary> 
/// 設(shè)置或獲取目前頁數(shù) 
/// </summary> 
public int PageNum 

get 

return PrivatePageNum; 

set 

if (value >= 1) 

PrivatePageNum = value; 



/// <summary> 
/// 設(shè)置或獲取最大分頁數(shù) 
/// </summary> 
public int MaxPageSize 

get 

return PrivateMaxPageSize; 

set 

if (value >= 1) 

PrivateMaxPageSize = value; 



/// <summary> 
/// 設(shè)置或獲取每次顯示最大頁數(shù) 
/// </summary> 
public int MaxPages 

get 

return PrivateMaxPages; 

set 

PrivateMaxPages = value; 


/// <summary> 
/// 設(shè)置或獲取數(shù)據(jù)總數(shù) 
/// </summary> 
public int DateCount 

get 

return PrivateCount; 

set 

PrivateCount = value; 


/// <summary> 
/// 獲取數(shù)據(jù)總頁數(shù) 
/// </summary> 
public int AllPage 

get 

return PrivateAllPage; 


/// <summary> 
/// 初始化分頁 
/// </summary> 
public void Pagination() 

PageString = new StringBuilder(""); 
//得到總頁數(shù) 
PrivateAllPage = (int)Math.Ceiling((decimal)PrivateCount / (decimal)PrivateMaxPageSize); 
//防止上標(biāo)或下標(biāo)越界 
if (PrivatePageNum > PrivateAllPage) 

PrivatePageNum = PrivateAllPage; 

//滾動(dòng)游標(biāo)分頁方式 
int LeftRange, RightRange, LeftStart, RightEnd; 
LeftRange = (PrivateMaxPages + 1) / 2-1; 
RightRange = (PrivateMaxPages + 1) / 2; 
if (PrivateMaxPages >= PrivateAllPage) 

LeftStart = 1; 
RightEnd = PrivateAllPage; 

else 

if (PrivatePageNum <= LeftRange) 

LeftStart = 1; 
RightEnd = LeftStart + PrivateMaxPages - 1; 

else if (PrivateAllPage - PrivatePageNum < RightRange) 

RightEnd = PrivateAllPage; 
LeftStart = RightEnd - PrivateMaxPages + 1; 

else 

LeftStart = PrivatePageNum - LeftRange; 
RightEnd = PrivatePageNum + RightRange; 



//生成頁碼列表統(tǒng)計(jì) 
PageString.Append(...); 

StringBuilder PreviousString = new StringBuilder(""); 
//如果在第一頁 
if (PrivatePageNum > 1) 

... 

else 

... 

//如果在第一組分頁 
if (PrivatePageNum > PrivateMaxPages) 

... 

else 

... 

PageString.Append(PreviousString); 
//生成中間頁 
for (int i = LeftStart; i <= RightEnd; i++) 

//為當(dāng)前頁時(shí) 
if (i == PrivatePageNum) 

... 

else 

... 


StringBuilder LastString = new StringBuilder(""); 
//如果在最后一頁 
if (PrivatePageNum < PrivateAllPage) 

... 

else 

... 

//如果在最后一組 
if ((PrivatePageNum + PrivateMaxPages) < PrivateAllPage) 

... 

else 

... 

PageString.Append(LastString); 

/// <summary> 
/// 生成Tag分類表格 
/// </summary> 
public void TagTable(ExDataRow myExDataRow) 

InsertString.Append(...); 


調(diào)用方法: 
//得到分頁設(shè)置并放入Session 
ExRequest myExRequest = new ExRequest(); 
myExRequest.PageSession("Tag_", new string[] { "page", "size" }); 
//生成Tag分頁 
ExStringBuilder Tag = new ExStringBuilder(); 
//設(shè)置每次顯示多少條紀(jì)錄 
Tag.MaxPageSize = Convert.ToInt32(Session["Tag_size"]); 
//設(shè)置最多顯示多少頁碼 
Tag.MaxPages = 9; 
//設(shè)置當(dāng)前為第幾頁 
Tag.PageNum = Convert.ToInt32(Session["Tag_page"]); 
string[][] myNamenValue = new string[2][]{ 
new string[]{"MaxPageSize","PageNum","Count"}, 
new string[]{Tag.MaxPageSize.ToString(),Tag.PageNum.ToString()} 
}; 
//調(diào)用存儲(chǔ)過程 
DataTable myDataTable = mySQL.BatchGetDB("Tag_Page_Name_Select", myNamenValue, "Count"); 
Tag.DateCount = (int)mySQL.OutputCommand.Parameters["@Count"].Value; 
Tag.Pagination(); 

HeadPage.InnerHtml = FootPage.InnerHtml = Tag.GetPageHtml; 

for (int i = 0, j = myDataTable.Rows.Count; i < j; i++) 

Tag.TagTable(new ExDataRow(myDataTable.Rows[i])); 

TagBox.InnerHtml = Tag.GetHtml; 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 在线一区二区三区 | 成年人免费观看网站 | 日韩精品 | 国产精品久久久久久久久久久小说 | 久久中文字幕在线观看 | 欧美不卡在线 | 久久爱电影 | 日韩城人免费 | 在线观看免费视频黄 | 亚洲一区二区中文字幕 | 欧美一区在线视频 | 91在线高清视频 | 国产乱码精品一区二区三 | 欧美精品网站 | 一区二区三区免费观看 | 欧美一级片aaa | 狼人综合网 | 亚洲精品日韩综合观看成人91 | 一片毛片| 亚洲国产精品人人爽夜夜爽 | 亚洲精品一区二区网址 | 欧美影院 | 日韩一区二区精品 | 中文字幕日韩一区 | 国产精品无码久久久久 | 日本精品一区二区三区视频 | 天堂中文视频在线观看 | 精品一二三四区 | 国产高清一区二区 | 国产中文字幕亚洲 | 特黄一级 | 91久久精品国产91久久性色tv | 成人a级网站 | 亚洲一区二区 | 久久99这里只有精品 | www.天天操 | 久久精品国产免费 | 欧美成人福利 | 国产1区2区3区 | 精品在线一区 | 日韩1区2区 |