原文章如下:

/*
名稱: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,如需轉載請自行聯系原作者