天天看點

實作千萬級資料的分頁顯示--整理資料并測試

原文章如下:

實作千萬級資料的分頁顯示--整理資料并測試

/*

實作千萬級資料的分頁顯示--整理資料并測試

 名稱:spAll_DeleteNoneUnique

實作千萬級資料的分頁顯示--整理資料并測試

 輸入:要查詢的表名和字段清單

實作千萬級資料的分頁顯示--整理資料并測試

 輸出:

實作千萬級資料的分頁顯示--整理資料并測試

 調用:

實作千萬級資料的分頁顯示--整理資料并測試

 說明:實作千萬級資料的分頁顯示!--可以在5秒内擷取1448萬條記錄裡的第1200頁的100條記錄,雄不?

實作千萬級資料的分頁顯示--整理資料并測試

 作者:鐵拳

實作千萬級資料的分頁顯示--整理資料并測試

 郵件:

實作千萬級資料的分頁顯示--整理資料并測試

 網站:http://www.wellknow.net

實作千萬級資料的分頁顯示--整理資料并測試

 更新:20040610

實作千萬級資料的分頁顯示--整理資料并測試

 支援:http://bbs.wellknow.net

實作千萬級資料的分頁顯示--整理資料并測試

 版權:轉述時請注明來源:用思維創造未來的Wellknow.net

實作千萬級資料的分頁顯示--整理資料并測試

*/

實作千萬級資料的分頁顯示--整理資料并測試
實作千萬級資料的分頁顯示--整理資料并測試

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

實作千萬級資料的分頁顯示--整理資料并測試
實作千萬級資料的分頁顯示--整理資料并測試

    set @strTmp = ">(select max"

實作千萬級資料的分頁顯示--整理資料并測試

    set @strOrder = " order by [" + @fldName +"] asc"

實作千萬級資料的分頁顯示--整理資料并測試
實作千萬級資料的分頁顯示--整理資料并測試
實作千萬級資料的分頁顯示--整理資料并測試

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

實作千萬級資料的分頁顯示--整理資料并測試
實作千萬級資料的分頁顯示--整理資料并測試

    set @strTmp = ""

實作千萬級資料的分頁顯示--整理資料并測試

    if @strWhere != ''

實作千萬級資料的分頁顯示--整理資料并測試

        set @strTmp = " where " + @strWhere

實作千萬級資料的分頁顯示--整理資料并測試
實作千萬級資料的分頁顯示--整理資料并測試
實作千萬級資料的分頁顯示--整理資料并測試

        + @tblName + "]" + @strTmp + " " + @strOrder

實作千萬級資料的分頁顯示--整理資料并測試
實作千萬級資料的分頁顯示--整理資料并測試
實作千萬級資料的分頁顯示--整理資料并測試

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 

實作千萬級資料的分頁顯示--整理資料并測試
實作千萬級資料的分頁顯示--整理資料并測試

set @strTmp = ">(select max" 

實作千萬級資料的分頁顯示--整理資料并測試

set @strOrder = " order by [" + @OrderfldName +"] asc" 

實作千萬級資料的分頁顯示--整理資料并測試
實作千萬級資料的分頁顯示--整理資料并測試
實作千萬級資料的分頁顯示--整理資料并測試

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 != '' 

實作千萬級資料的分頁顯示--整理資料并測試
實作千萬級資料的分頁顯示--整理資料并測試
實作千萬級資料的分頁顯示--整理資料并測試
實作千萬級資料的分頁顯示--整理資料并測試

+ @OrderfldName + "] from [" + @tblName + "] where " + @strWhere + " " 

實作千萬級資料的分頁顯示--整理資料并測試

+ @strOrder + ") as tblTmp) and " + @strWhere + " " + @strOrder 

實作千萬級資料的分頁顯示--整理資料并測試
實作千萬級資料的分頁顯示--整理資料并測試

if @PageIndex = 1 

實作千萬級資料的分頁顯示--整理資料并測試
實作千萬級資料的分頁顯示--整理資料并測試

set @strTmp = "" 

實作千萬級資料的分頁顯示--整理資料并測試
實作千萬級資料的分頁顯示--整理資料并測試

set @strTmp = " where " + @strWhere 

實作千萬級資料的分頁顯示--整理資料并測試
實作千萬級資料的分頁顯示--整理資料并測試
實作千萬級資料的分頁顯示--整理資料并測試

+ @tblName + "]" + @strTmp + " " + @strOrder 

實作千萬級資料的分頁顯示--整理資料并測試
實作千萬級資料的分頁顯示--整理資料并測試
實作千萬級資料的分頁顯示--整理資料并測試

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,占據了高端和甚高端的大部分業務。

微軟在這方面打個勝仗,還有很長的路要走--個人認為,和硬體公司合作研發相配套硬體是不二法門。

本文轉自斯克迪亞部落格園部落格,原文連結:http://www.cnblogs.com/sgsoft/archive/2004/10/23/55800.html,如需轉載請自行聯系原作者