千萬數量級分頁儲存過程,可支援多表查詢,任意排序

2021-09-01 00:24:58 字數 4081 閱讀 8313

從程式中考慮:比如用資料緩衝和連線池技術

從資料庫伺服器端考慮:比如csdn只選出前300行紀錄,因為使用者不需要那麼多紀錄。你也不必把1000萬條全部分頁。你也不必把紀錄放在乙個表中,一年(太多就乙個月)的資料放一張表或定期把歷史資料匯出到資料資料倉儲中,不要用一張表裝1000萬條記錄。做好索引。優化查詢!盡量少用模糊查詢,避免表掃瞄。不能讓客戶端連續多次搜尋(csdn就是)

千萬級的資料庫,有分頁的意義嗎?對於使用者來說就是資訊的海洋了,去看看google怎麼做的吧,

根本就不存在如何分頁的問題,如果乙個結果有千萬條,那跟沒有結果一樣是沒有一樣.應該是統計條數,取出,前n條進行分頁,如果到地還在準備分頁的話,再次取結果n,進行分頁.並且在其間推薦使用者進行遞進式搜尋,來降低資訊量,才式正確的

千萬數量級分頁儲存過程(可支援多表查詢,任意排序)

功能不錯的分頁儲存過程,可支援多表查詢,任意排序

create procedureusp_paginglarge

@tablenames var char(200),--表名,可以是多個表,但不能用別名

@primarykey var char(100),--主鍵,可以為空,但 @order為空時該值不能為空

@fields var char(200),--要取出的字段,可以是多個表的字段,可以為空,為空表示select*

@pagesize int,--每頁記錄數

@currentpage int,--當前頁,0表示第1頁

@filter var char(200)='',--條件,可以為空,不用填where

@group var char(200)='',--分組依據,可以為空,不用填groupby

@order var char(200)=''--排序,可以為空,為空缺省按主鍵公升序排列,不用填orderby

asbegin

declare @sortcolumn var char(200)

declare @operator char(2)

declare @sorttable var char(200)

declare @sortname var char(200)

if  @fields=''

set @fields='*'

if  @filter=''

set @filter='where 1=1'

else

set @filter='where '+ @filter

if  @group<>''

set @group='groupby'+ @group

if  @order<>''

begin

declare @pos1 int, @pos2 int

set @order=replace(replace( @order,'asc','asc'),'desc','desc')

if charindex('desc', @order)>0

if charindex('asc', @order)>0

begin

if charindex('desc', @order)='

endelse

set @operator='<='

else

set @operator='>='

set @sortcolumn=replace(replace(replace( @order,'asc',''),'desc',''),'','')

set @pos1=charindex(',', @sortcolumn)

if  @pos1>0

set @sortcolumn=substring( @sortcolumn,1, @pos1-1)

set @pos2=charindex('.', @sortcolumn)

if  @pos2>0

begin

set @sorttable=substring( @sortcolumn,1, @pos2-1)

if  @pos1>0

set @sortname=substring( @sortcolumn, @pos2+1, @pos1- @pos2-1)

else

set @sortname=substring( @sortcolumn, @pos2+1,len( @sortcolumn)- @pos2)

endelse

begin

set @sorttable= @tablenames

set @sortname= @sortcolumn

endend

else

begin

set @sortcolumn= @primarykey

set @sorttable= @tablenames

set @sortname= @sortcolumn

set @order= @sortcolumn

set @operator='>='

enddeclare @type var char(50)

declare @prec int

select @type=t.name, @prec=c.prec

from  sysobjectso

join syscolumnsc on o.id=c.id

join systypest on c.xusertype=t.xusertype

where o.name= @sorttableandc.name= @sortname

if charindex('char', @type)>0

set @type= @type+'('+cast( @precas varchar)+')'

declare @toprows int

set @toprows= @pagesize* @currentpage+1

print @toprows

print @operator

exec('

declare @sortcolumnbegin'+ @type+'

setrowcount'+ @toprows+'

select @sortcolumnbegin='+ @sortcolumn+' from  '+ @tablenames+''+ @filter+''+ @group+'orderby'+ @order+'

setrowcount'+ @pagesize+'

select'+ @fields+' from  '+ @tablenames+''+ @filter+'and'+ @sortcolumn+''+ @operator+' @sortcolumnbegin'+ @group+'orderby'+ @order+'

')end

go--呼叫例子:

--1.單錶/單排序

execusp_paginglarge'bigtable','d_id','d_id,d_title,d_c on tent,d_time',20,1,'','','d_iddesc'

--2.單錶/多排序

execusp_paginglarge'bigtable','d_id','*',20,0,'','','d_timeasc,d_iddesc'

--3.多表/單排序

exec usp_paginglarge'bigtableleftjoin bigtable_author on bigtable.d_id=bigtable_author.bigtable_id','bigtable.d_id','bigtable.d_id,bigtable.d_title,bigtable.d_c on tent,bigtable.d_time,bigtable_author.d_author',20,0,'','','bigtable.d_idasc'

--4.多表/多排序

exec usp_paginglarge'bigtableleftjoin bigtable_author on bigtable.d_id=bigtable_author.bigtable_id','bigtable.d_id','bigtable.d_id,bigtable.d_title,bigtable.d_c on tent,bigtable.d_time,bigtable_author.d_author',20,0,'','','bigtable.d_timeasc,bigtable.d_iddesc'

千萬數量級分頁儲存過程 可支援多表查詢,任意排序

create procedure usp paginglarge tablenames varchar 200 表名,可以是多個表,但不能用別名 primarykey varchar 100 主鍵,可以為空,但 order為空時該值不能為空 fields varchar 200 要取出的字段,可以是...

千萬數量級分頁儲存過程 可支援多表查詢,任意排序

create procedure usp paginglarge tablenames varchar 200 表名,可以是多個表,但不能用別名 primarykey varchar 100 主鍵,可以為空,但 order為空時該值不能為空 fields varchar 200 要取出的字段,可以是...

高效多表分頁儲存過程,可支援多表查詢,任意排序

create procedure usp paginglarge tablenames varchar 200 表名,可以是多個表,但不能用別名 primarykey varchar 100 主鍵,可以為空,但 order為空時該值不能為空 fields varchar 4000 要取出的字段,可以...