實現千萬級資料分頁的儲存過程

2021-08-22 01:41:46 字數 3217 閱讀 4790

實現千萬級資料分頁的儲存過程

/*此儲存過程的思路是將關鍵字段與無重複索引字段結合起來進行排序,如果關鍵字

段有重複,可再按索引字段進行排序從而進一步分頁,需強調的是

@fldindex 字

段型別必須為可參與數學計算的資料型別,即使 @fldindex 欄位有重複也可使

用,只要 @flname 欄位和 @fldindex 不同時具有重複資料即可正常使用。例

如下表所示:

idcustid

birthday13

1982-03-1023

1979-10-0434

1980-09-02

如果按 id 排序,則可以使用 id 作為 @fldname 並且省略 @fldindex 引數,

如果按 custid 排序則將 custid 作為 @fldname 並以 id 作為 @fldindex

字段,如果同時出現 id 與 custid 重複的情況下就不適合使用這種引數,例如:

idcustid

birthday13

1982-03-1013

1979-10-0434

1980-09-02

只要 @fldindex 和 @fldname 欄位不同時出現重複就可以了,如果資料中具有

唯一索引的主鍵字段,則應使用該欄位作為 @fldindex 引數,無需其它條件。

sql server 查詢分析器中呼叫方法如下:

exec getrecordfrompage 'tablename', 'sortfield', 'indexfield', 10, 5, 0,

'indexfield > 10 and indexfield <> 100'

更多參考請見:

*//*

函式名稱: getrecordfrompage

函式功能: 獲取指定頁的資料

引數說明: @tblname 包含資料的表名

@fldname 關鍵欄位名

@fldindex 無重複索引字段

@pagesize 每頁記錄數

@pageindex 要獲取的頁碼

@ordertype 排序型別, 0 - 公升序, 1 - 降序

@strwhere 查詢條件 (注意: 不要加 where)

作  者: 鐵拳

郵  箱: [email protected]

*/create procedure getrecordfrompage

@tblname varchar(255), -- 表名

@fldname varchar(255), -- 欄位名

@fldindex varchar(255)='', -- 無重複索引字段

@pagesize int = 10, -- 頁尺寸

@pageindex int = 1, -- 頁碼

@ordertype bit = 0, -- 設定排序型別, 非 0 值則降序

@strwhere varchar(2000) = '' -- 查詢條件 (注意: 不要加 where)

asdeclare @strsql varchar(6000) -- 主語句

declare @strtmp varchar(1000) -- 臨時變數

declare @strorder varchar(500) -- 排序型別

declare @strfield varchar(1000) -- 用來聯合的字段

if @pageindex < 1

return

set @strfield = '[' + @fldname + ']'

-- 計算後的資料精確到小數點後 33 位

if @fldindex != ''

set @strfield = ' convert(numeric(38,33), [' + @fldname

+ ']) + convert(numeric(38,33), [' + @fldindex

+ '] / 10000000000000000000000000000) '

if @ordertype != 0

begin

set @strtmp = '<(select min'

set @strorder = ' order by ' + @strfield + ' desc'

endelse

begin

set @strtmp = '>(select max'

set @strorder = ' order by ' + @strfield + ' asc'

endset @strsql = 'select top ' + str(@pagesize) + ' * from ['

+ @tblname + '] where ' + @strfield + @strtmp

+ '(tmpindex) from (select top ' + str((@pageindex-1)*@pagesize) + @strfield

+ ' tmpindex from [' + @tblname + ']' + @strorder + ') as tbltmp)'

+ @strorder

if @strwhere != ''

set @strsql = 'select top ' + str(@pagesize) + ' * from ['

+ @tblname + '] where ' + @strfield + @strtmp

+ '(tmpindex) from (select top ' + str((@pageindex-1)*@pagesize) + @strfield

+ ' tmpindex from [' + @tblname + '] where ' + @strwhere + ' '

+ @strorder + ') as tbltmp) and ' + @strwhere + ' ' + @strorder

if @pageindex = 1

begin

set @strtmp = ''

if @strwhere != ''

set @strtmp = ' where (' + @strwhere + ')'

set @strsql = 'select top ' + str(@pagesize) + ' * from ['

+ @tblname + ']' + @strtmp + ' ' + @strorder

endexec (@strsql)go

實現千萬級資料分頁的儲存過程!

經測試,在 14483461 條記錄中查詢第 100000 頁,每頁 10 條記錄按公升序和降序第一次時間均為 0.47 秒,第二次時間均為 0.43 秒,測試語法如下 exec getrecordfrompage news,newsid,10,100000 news 為 表名,newsid 為關鍵...

實現千萬級資料分頁的儲存過程!

經測試,在 14483461 條記錄中查詢第 100000 頁,每頁 10 條記錄按公升序和降序第一次時間均為 0.47 秒,第二次時間均為 0.43 秒,測試語法如下 exec getrecordfrompage news,newsid,10,100000 news 為 表名,newsid 為關鍵...

實現千萬級資料分頁的儲存過程

經測試,在 14483461 條記錄中查詢第 100000 頁,每頁 10 條記錄按公升序和降序第一次時間均為 0.47 秒,第二次時間均為 0.43 秒,測試語法如下 exec getrecordfrompage news,newsid,10,100000 news 為 表名,newsid 為關鍵...