大資料量下的分頁儲存過程

2022-10-15 09:03:02 字數 3304 閱讀 7628

由於現網日誌資料庫查詢總是超時,最近試著尋找可行的解決方案,找了很多種進行改造,經過測試發現,以下儲存過程效率最好。

我在本地資料庫造了乙個 25543862 條資料,每頁 10 條資料,測試前 1000 頁查詢都是幾十毫秒就可以了,翻頁到60萬頁也是2秒以內。在現網上執行了一下該儲存過程,

感覺效率也還可以,翻到6000頁也在1秒以內。(建議排序欄位和經常查詢欄位用同乙個,效率區別非常明顯)。大家以後工作應該能用得到,所以發出來跟大家共享一下。

儲存過程如下:

create procedure storage_pagingtest

@tblname varchar(255), -- 表名

@strgetfields varchar(1000需要返回的列

@fldname varchar(255排序的欄位名

@pagesize int = 10, -- 頁尺寸

@pageindex int = 1, -- 頁碼

@docount bit = 0, -- 返回記錄總數, 非0 值則返回

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

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

as declare @strsql varchar(5000) -- 主語句

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

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

if @docount != 0

begin

if @strwhere != ''

set @strsql = 'select count(*) as total from [' + @tblname

+ '] where ' + @strwhere

else

set @strsql = 'select count(*) as total from [' + @tblname

+ ']'

end--以上**的意思是如果@docount傳遞過來的不是,就執行總數統計。以下的所有**都是@docount為的情況

else

begin

if @ordertype != 0

begin

set @strtmp = '<(select min'

set @strorder = ' order by [' + @fldname + '] desc'

--如果@ordertype不是,就執行降序,這句很重要

endelse

begin

set @strtmp = '>(select max'

set @strorder = ' order by [' + @fldname + '] asc'

endif @pageindex = 1

begin

if @strwhere != ''

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

+ @strgetfields + ' from [' + @tblname

+ '] where ' + @strwherestrorder

else

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

+ @strgetfields + ' from [' + @tblname + '] '

+ @strorder

--如果是第一頁就執行以上**,這樣會加快執行速度

endelse

begin

--以下**賦予了@strsql以真正執行的sql**

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

+ @strgetfields + ' from [' + @tblname + '] where ['

+ @fldnamestrtmpfldname

+ ']) from (select top ' + str(( @pageindex - 1 )

* @pagesize) + ' ['

+ @fldname + '] from [' + @tblnamestrorder

+ ') as tbltmp)' + @strorder

if @strwhere != ''

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

+ @strgetfields + ' from [' + @tblname

+ '] where [' + @fldnamestrtmp + '(['

+ @fldname + ']) from (select top '

+ str(( @pageindex - 1 ) * @pagesize) + ' ['

+ @fldname + '] from [' + @tblname + '] where '

+ @strwherestrorder

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

+ @strorder

endendexec (@strsql)

go執行語句如下:

declare @d datetime

set @d = getdate()

execute storage_pagingtest 'logsmshall_mutual', -- 表名

'*', -- 需要返回的列

'receivetime', -- 排序的欄位名(盡量是最頻繁排序的那乙個)

10, -- 頁尺寸

600000, -- 頁碼

0, -- 返回記錄總數, 非0 值則返回

1, -- 設定排序型別, 非0 值則降序

'receivetime> dateadd(day,-35,getdate())'

select [語句執行花費時間(毫秒)] = datediff(ms, @d, getdate())

將儲存過程還原為普通sql如下:

select top 10

*from logsmshall_mutual

where receivetime > ( select max(receivetime)

from ( select top 1000

receivetime

from logsmshall_mutual

where receivetime > dateadd(day, -35, getdate())

order by receivetime

商業智慧型解決方案 三 大資料量解決方案

finebi商業智慧型解決方案 三 大資料量解決方案 finebi商業智慧型解決方案的多維資料庫集合強大的資料計算能力和便捷性為一體,支撐著finebi的 大資料量分析功能,是finebi處理大資料的靈魂。finebi商業智慧型系統的多維資料庫採用預處理以及平行計算的先進資料處理模式,使用nio記憶...

大資料儲存和管理的技術分析

大資料 這是業內熱門詞彙,描述了企業大量積累 儲存和挖掘大檔案 400gb到tb級 的現象。隨著資訊的質量 種類和豐富性達到新的水平,大資料已經形成多年了。大資料集的蔓延是由那些執行豐富的資料格式 如使用音訊或 檔案 的企業或其積累充足的資訊來從統計角度洞察市場 例如在社交 網路上儲存帖子 的意願而...

大資料時代下的社交網路

網際網路的發展為社交網路的發展奠定了基礎,社交網路的發展同時也為讓網際網路的關係網越來越複雜,在這個需求背景下,就提出了乙個社交圖譜的概念,也就是網路社交上表示人與人之間關係的網路圖譜,但是我們有沒有想到,其實社交圖譜也是大資料時代的乙個產物。fb的創始人扎克伯格就是提出了社交圖譜的概念,也讓他的 ...