實現千萬級數據的分頁顯示--整理資料并測試(轉)
2024-07-21 02:06:41
供稿:網友
菜鳥學堂:
create procedure getrecordfrompage
@tblname varchar(255), -- 表名
@fldname varchar(255), -- 字段名
@pagesize int = 10, -- 頁尺寸
@pageindex int = 1, -- 頁碼
@iscount bit = 0, -- 返回記錄總數, 非 0 值則返回
@ordertype bit = 0, -- 設置排序類型, 非 0 值則降序
@strwhere varchar(1000) = '' -- 查詢條件 (注意: 不要加 where)
as
declare @strsql varchar(6000) -- 主語句
declare @strtmp varchar(100) -- 臨時變量
declare @strorder varchar(400) -- 排序類型
if @ordertype != 0
begin
set @strtmp = "<(select min"
set @strorder = " order by [" + @fldname +"] desc"
end
else
begin
set @strtmp = ">(select max"
set @strorder = " order by [" + @fldname +"] asc"
end
set @strsql = "select top " + str(@pagesize) + " * from ["
+ @tblname + "] where [" + @fldname + "]" + @strtmp + "(["
+ @fldname + "]) from (select top " + str((@pageindex-1)*@pagesize) + " ["
+ @fldname + "] from [" + @tblname + "]" + @strorder + ") as tbltmp)"
+ @strorder
if @strwhere != ''
set @strsql = "select top " + str(@pagesize) + " * from ["
+ @tblname + "] where [" + @fldname + "]" + @strtmp + "(["
+ @fldname + "]) from (select top " + str((@pageindex-1)*@pagesize) + " ["
+ @fldname + "] 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
end
if @iscount != 0
set @strsql = "select count(*) as total from [" + @tblname + "]"
exec (@strsql)
go
修改后,便于使用的代碼:
修改一點點便于其他人使用
create procedure getrecordfrompage
@tblname varchar(255), -- 表名
@fldname varchar(255), -- 字段名
@orderfldname varchar(255), -- 排序字段名
@statfldname varchar(255), -- 統計字段名
@pagesize int = 10, -- 頁尺寸
@pageindex int = 1, -- 頁碼
@iscount bit = 0, -- 返回記錄總數, 非 0 值則返回
@ordertype bit = 0, -- 設置排序類型, 非 0 值則降序
@strwhere varchar(1000) = '' -- 查詢條件 (注意: 不要加 where)
as
declare @strsql varchar(6000) -- 主語句
declare @strtmp varchar(100) -- 臨時變量
declare @strorder varchar(400) -- 排序類型
if @ordertype != 0
begin
set @strtmp = "<(select min"
set @strorder = " order by [" + @orderfldname +"] desc"
end
else
begin
set @strtmp = ">(select max"
set @strorder = " order by [" + @orderfldname +"] asc"
end
set @strsql = "select top " + str(@pagesize) + " " + @fldname + " from ["
+ @tblname + "] where [" + @orderfldname + "]" + @strtmp + "(["
+ @orderfldname + "]) from (select top " + str((@pageindex-1)*@pagesize) + " ["
+ @orderfldname + "] from [" + @tblname + "]" + @strorder + ") as tbltmp)"
+ @strorder
if @strwhere != ''
set @strsql = "select top " + str(@pagesize) + " " + @fldname + " from ["
+ @tblname + "] where [" + @orderfldname + "]" + @strtmp + "(["
+ @orderfldname + "]) from (select top " + str((@pageindex-1)*@pagesize) + " ["
+ @orderfldname + "] 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) + " " + @fldname + " from ["
+ @tblname + "]" + @strtmp + " " + @strorder
end
if @iscount != 0
set @strsql = "select count(" + @statfldname + ") as total from [" + @tblname + "]"
exec (@strsql)
go
說明:
增加了下面兩個部分,其他人拷貝去可根據自己需要進行設定。
@orderfldname varchar(255), -- 排序字段名
@statfldname varchar(255), -- 統計字段名
fldname作用由排序轉變為控制需要打開的字段。
@fldname varchar(255), -- 字段名
----------------------------------------------
個人測試結果:
通過測試,性能并沒有原帖子所說的好。但這可能是機器原因,要知道,在sql server中,2千萬條空記錄大約要占用3g左右的空間,而插入這2千萬條記錄,在我的測試平臺上耗費了近10個小時,內存占用從125m增長到350m左右。我實際測試了一下,在建立索引的情況下,執行一次根據主鍵,返回一條記錄的查詢,在512m內存,2.2g cpu,20g單分區存儲數據庫文件,100m局域網的配置情況下,平均大約需要15s左右(這只是我的個人測試,不具有任何實質性意義。)。
另外我發現,對于上述配置的機器,運行sql server時,在百萬級別以下的表中執行查詢--(索引良好,沒有壞點,或者最新索引),速度差別不大,但達到8位數以上,也就是千萬以上時候,sql server表現就不太好了,當然,這與機器配置有很大關系了。但無可否認,sql server 2000還不是企業級數據庫的最佳選擇,在oracle執行類似的查詢,性能要好于sql server。插入執行完畢的時間是4個小時,內存占用一直沒有變化:400m。執行相同查詢,需要的時間是10s左右。
小弟最近忙于一個公積金項目,對于部門數據庫、中央數據庫的調度進行了一些評估,oracle軟件+sun/hp的硬件仍然占了中國政府機構服務器的大部分市場,再就是ibm,占據了高端和甚高端的大部分業務。
微軟在這方面打個勝仗,還有很長的路要走--個人認為,和硬件公司合作研發相配套硬件是不二法門。