風人園

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

          sql server2000數據分頁的兩種方法

          如果一個查詢的結果數據量巨大,就需要數據查詢的時候就分頁,每次只返回其中一頁

          第一種方法:
          思路是根據頁號取出兩部分數據,比如取出前90條,然后取出前100條,然后比較取出兩次結果的差集。

          在30萬條記錄的情況下,如果只分100頁(結果有10000條記錄),大約需要1分半鐘。索引建得好的話,1分鐘左右。


          //select * from //這一句是不能修改的了,因為它是從結果中讀取,所以必須要用*
          //(select top @h_count (@filedlist) from @tableName .....) as big //取出符合條件的上限的記錄
          //where
          //big.guid   //這里是關鍵,根據主鍵從下限結果中過濾掉重復的記錄(只留下不同的數據,也就是求交集)
          //not in
          //(select top @l_count guid from @table .....)//下限
          //order @orderby  //原來的格式,這里只保留了orderby之后的,應該保留條件之后所有的,包括gruopby什么的

          函數類似如此:
            public string MakeSqlPager(string sourceSql,int pageIndex)
            {
             //使用默認頁面大小
             string orderbyStr=sourceSql.Substring(sourceSql.ToLower().IndexOf("order by"));
             int index=sourceSql.ToLower().IndexOf("select");
             string bigRes="("+ sourceSql.Insert(index+6," top "+((pageIndex+1)*_pageSize).ToString()+" ")+") as big";
             string smallRes="("+ sourceSql.Insert(index+6," top "+(pageIndex*_pageSize).ToString()+" ")+")";
             return "select * from "+bigRes+" where big.guid not in "+smallRes+" "+orderbyStr;
            }

          這種方法還可以改進,就是第二次取過濾時從第一個的結果里面過濾。

          第二種方法:
          掐頭去尾,程序還沒寫
          SELECT * FROM
          (
            SELECT TOP 100 * FROM
            (
              SELECT TOP 100000 * FROM pagetest ORDER BY regt ASC
             ) as a
            ORDER BY regt desc
          ) as b
           ORDER BY regt ASC

          測試了一下,大約用時間29秒。

          比較:
          第一種方法的效率很低,猜測是因為多次需要循環比較,時間復雜度要高一個等級。比如,這種方法的響應時間和所取得的頁號有很大關系。
          第二種方法還是可以接受的,和頁號無關,但是也需要兩次比較

          網上還有使用比較ID的方法的,但是不是所有的表都有ID,即使有,也不一定是int類型的。
          還有用存儲過程創建臨時表的,我還沒有測試效率如何

          sqlserver里面沒有rownum 這個功能(最新的2005beta2版本據說有了,Oracle里面有),所以一次比較就能分頁的算法還真不好寫

          posted on 2009-06-02 08:30 風人園 閱讀(541) 評論(0)  編輯  收藏 所屬分類: Database

          主站蜘蛛池模板: 平顺县| 南木林县| 南汇区| 绥滨县| 德令哈市| 山阳县| 铅山县| 礼泉县| 漾濞| 凤城市| 繁昌县| 宿迁市| 邵阳市| 云阳县| 陵水| 宝兴县| 鹤峰县| 明溪县| 当涂县| 汤原县| 交口县| 类乌齐县| 南宁市| 内丘县| 芷江| 祁东县| 山西省| 达州市| 贡山| 弋阳县| 渝中区| 兰西县| 习水县| 天祝| 苏州市| 华宁县| 鄯善县| 顺昌县| 理塘县| 凌云县| 扶风县|