<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    風(fēng)人園

    弱水三千,只取一瓢,便能解渴;佛法無邊,奉行一法,便能得益。
    隨筆 - 99, 文章 - 181, 評論 - 56, 引用 - 0
    數(shù)據(jù)加載中……

    Paging (MS SQL Server/Oracle)

    雖然 DataGrid 控件自己帶了一個分頁處理機制,但它是將符合查詢條件的所有記錄讀入內(nèi)存,然后進行分頁顯示的。隨著符合條件的記錄數(shù)目增多,就會出現(xiàn)運行效率問題,或者至少是資源的利用率下降。

    下面的代碼示例都以下面的表結(jié)構(gòu)為準(zhǔn):

     

      Articles 表 SQL Server 類型 Oracle 類型
    PK Id int (自增) number(9) (插入時在當(dāng)前最大值上加1)
      Author nvarchar(10) nvarchar2(10)
      Title nvarchar(50) nvarchar2(50)
      PubTime datetime date

    SQL Server / Access 等微軟產(chǎn)品中,我們通常的自定義分頁有兩種思路:

    一種是以 ASP.NET Forum 為代表的、“臨時表”方法:即在存儲過程中建立一個臨時表,該臨時表包含一個序號字段(1,2,3,....)以及表的主鍵(其他能夠唯一確定一行記錄的字段也是可以的)字段。存儲過程可能如下:(編號 SS1)

    CREATE Procedure GetAllArticles_Paged
    (
    ???? @PageIndex int,
    ???? @PageSize int,
    ???? @TotalRecords out int,
    ???? @TotalPages out int
    )
    AS

    DECLARE @PageLowerBound int
    DECLARE @PageUpperBound int

    -- Set the page bounds
    SET @PageLowerBound = @PageSize * @PageIndex
    SET @PageUpperBound = @PageLowerBound + @PageSize + 1

    -- Create a temp table to store the select results
    CREATE TABLE #tmp
    (
    ???? RecNo int IDENTITY (1, 1) NOT NULL,
    ???? ArticleID int
    )

    INSERT INTO #tmp
    ???? SELECT [ID]
    ???? FROM Articles
    ???? ORDER BY PubTime DESC

    SELECT A.*
    FROM Articles A (nolock), #tmp T
    WHERE A.ID = T.ArticleID AND
    ???? T.RecNo > @PageLowerBound AND
    ???? T.RecNo < @PageUpperBound
    ORDER BY T.RecNo

    GO

    另一種可能更適合程序中“拼湊” SQL 語句:用兩次 TOP 命令取得我們所要的分頁數(shù)據(jù),例如:(編號 SS2)

    SELECT * FROM
    ???? (
    ???? SELECT TOP(PageSize) * FROM
    ???? (
    ????????? SELECT TOP (PageSize * PageIndex) *
    ????????? FROM Articles
    ????????? ORDER BY PubTime DESC
    ???? )
    ???? ORDER BY PubTime ASC
    )
    ORDER BY PubTime DESC

    這個的想法就是“掐頭去尾”,還有不少分頁的方法,這里就不一一列出了。

    對于 Oracle 數(shù)據(jù)庫,有幾處不同嚴(yán)重妨礙了上面幾個方法的實施,比如,Oracle 不支持 TOP 關(guān)鍵字:不過這個好像并不十分嚴(yán)重,因為它提供了 rownum 這個隱式游標(biāo),可以實現(xiàn)與 TOP 類似的功能,如:

    SELECT TOP 10 ... FROM WHERE ...

    要寫成

    SELECT ... FROM ... WHERE ... AND rownum <= 10

    rownum 是記錄序號(1,2,3...),但有一個比較麻煩的事情是:如果 SQL 語句中有 ORDER BY ... 排序的時候,rownum 居然是先“標(biāo)號”后排序!這樣,這個序號如果不加處理是不合乎使用需求的。

    至于臨時表,Oracle 的臨時表和 SQL Server 的有很大不同,我還沒搞懂這個東西,就不妄加揣測了。

    國內(nèi)網(wǎng)站中介紹 Oracle 分頁的資料很少,我找到了一個國外站點(www.faqts.com)的一篇 FAQ,根據(jù)這篇文章的介紹,可以如下分頁:(編號 Ora1)

    SELECT * FROM
    ???? (
    ???? SELECT A.*, rownum r
    ???? FROM
    ????????? (
    ????????? SELECT *
    ????????? FROM Articles
    ????????? ORDER BY PubTime DESC

    ????????? ) A
    ???? WHERE rownum <= PageUpperBound
    ???? ) B
    WHERE r > PageLowerBound;

    其中藍(lán)色部分可以改為任意的、需要的 SQL SELECT 語句,這點倒是挺方便的。

     

    posted on 2007-02-12 15:57 風(fēng)人園 閱讀(331) 評論(0)  編輯  收藏 所屬分類: Database

    主站蜘蛛池模板: 亚洲乱色伦图片区小说| 精品国产呦系列在线观看免费| 91av视频免费在线观看| 亚洲一区视频在线播放 | 国产亚洲美女精品久久久| 67pao强力打造67194在线午夜亚洲| 香蕉免费看一区二区三区| 精品国产亚洲一区二区在线观看| 一级毛片免费不卡| 永久亚洲成a人片777777| 拍拍拍无挡免费视频网站| 亚洲AV永久青草无码精品| 美女羞羞免费视频网站| 亚洲精品国产精品乱码不卡 | 日韩视频在线免费观看| 亚洲视频日韩视频| h视频在线免费看| 亚洲综合久久精品无码色欲| 国产成人无码区免费A∨视频网站 国产成人涩涩涩视频在线观看免费 | 美女被艹免费视频| 久久精品国产精品亚洲| 久久久久免费精品国产| 亚洲视频在线免费看| 成人黄18免费视频| 亚洲欧洲日产国码二区首页| 99re6在线视频精品免费| 亚洲成年轻人电影网站www| 少妇高潮太爽了在线观看免费| 国产亚洲精品仙踪林在线播放| 久久亚洲国产精品123区| 午夜视频在线免费观看| 亚洲AV无码乱码在线观看裸奔| 18成禁人视频免费网站| 久久无码av亚洲精品色午夜 | a毛片免费全部在线播放**| 亚洲福利电影在线观看| 91制片厂制作传媒免费版樱花| 伊人久久亚洲综合影院首页| 永久免费的网站在线观看| 免费国产在线精品一区| 亚洲高清视频一视频二视频三|