日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

一種理想的大數(shù)據(jù)量分頁(yè)查詢方案

 WindySky 2009-07-16
本文旨在介紹一種對(duì)數(shù)據(jù)庫(kù)中的大數(shù)據(jù)量表格進(jìn)行分頁(yè)查詢的實(shí)現(xiàn)方法,該方法對(duì)應(yīng)用服務(wù)器、數(shù)據(jù)庫(kù)服務(wù)器、查詢客戶端的cpu和內(nèi)存占用都較低,查詢速度較快,是一個(gè)較為理想的分頁(yè)查詢實(shí)現(xiàn)方案。
1.問(wèn)題的提出
在軟件開(kāi)發(fā)中,大數(shù)據(jù)量的查詢是一個(gè)常見(jiàn)的問(wèn)題,經(jīng)常會(huì)遇到對(duì)大量數(shù)據(jù)進(jìn)行查詢的場(chǎng)景。常見(jiàn)的對(duì)大數(shù)據(jù)量查詢的解決方案有以下兩種:一、將全部數(shù)據(jù)先查詢到內(nèi)存中,然后在內(nèi)存中進(jìn)行分頁(yè),這種方式對(duì)內(nèi)存占用較大,必須限制一次查詢的數(shù)據(jù)量。二、采用存儲(chǔ)過(guò)程在數(shù)據(jù)庫(kù)中進(jìn)行分頁(yè),這種方式對(duì)數(shù)據(jù)庫(kù)的依賴較大,不同的數(shù)據(jù)庫(kù)實(shí)現(xiàn)機(jī)制不通,并且查詢效率不夠理想。以上兩種方式對(duì)用戶來(lái)說(shuō)都不夠友好。
2.解決思路
通過(guò)在待查詢的數(shù)據(jù)庫(kù)表上增加一個(gè)用于查詢的自增長(zhǎng)字段,然后采用該字段進(jìn)行分頁(yè)查詢,可以很好地解決這個(gè)問(wèn)題。下面舉例說(shuō)明這種分頁(yè)查詢方案。
一、在待查詢的表格上增加一個(gè)long型的自增長(zhǎng)列,取名為“queryId”,mssql、sybase直接支持自增長(zhǎng)字段,oracle可以用sequence和trigger來(lái)實(shí)現(xiàn)。然后在該列上加上一個(gè)索引。添加queryId列的語(yǔ)句如下:
Mssql: [QUERYID] [bigint] IDENTITY (1, 1)
Sybase: QUERYID  numeric(19)  identity www.
Oracle:
CREATE SEQUENCE queryId_S
         INCREMENT BY 1
         START WITH 1
            MAXVALUE 999999999999999 MINVALUE 1
            CYCLE
            CACHE 20
            ORDER;
CREATE OR REPLACE TRIGGER queryId_T BEFORE INSERT
             ON "test_table"
             FOR EACH ROW
BEGIN
      select queryId_S.nextval into :new.queryId from dual;
END;
二、在查詢第一頁(yè)時(shí),先按照大小順序的倒序查出所有的queryId,語(yǔ)句如下:select queryId from test_table where + 查詢條件 +order by queryId desc 。因?yàn)橹皇遣樵僸ueryId字段,即使表格中的數(shù)據(jù)量很大,該查詢也會(huì)很快得到結(jié)果。然后將得到的queryId保存在應(yīng)用服務(wù)器的一個(gè)數(shù)組中。 字串9
三、用戶在客戶端進(jìn)行翻頁(yè)操作時(shí),客戶端將待查詢的頁(yè)號(hào)作為參數(shù)傳遞給應(yīng)用服務(wù)器,服務(wù)器通過(guò)頁(yè)號(hào)和queyId數(shù)組算出待查詢的queyId最大和最小值,然后進(jìn)行查詢。
算出queyId最大和最小值的算法如下,其中page為待查詢的頁(yè)號(hào),pageSize為每頁(yè)的大小,queryIds為第二步生成的queryId數(shù)組:
        int startRow = (page - 1) * pageSize;
        int endRow = page * pageSize - 1;
        if (endRow >=queryIds.length)
        {
            endRow = this.queryIds.length - 1;
        }
        long startId =queryIds[startRow];
        long endId =queryIds[endRow];
查詢語(yǔ)句如下:
String sql = "select * from test_table" + 查詢條件 + "(queryId <= " + startId + " and queryId >= " + endId + ")";
字串7
3.效果評(píng)價(jià)
該分頁(yè)查詢方法對(duì)所有數(shù)據(jù)庫(kù)都適用,對(duì)應(yīng)用服務(wù)器、數(shù)據(jù)庫(kù)服務(wù)器、查詢客戶端的cpu和內(nèi)存占用都較低,查詢速度較快,是一個(gè)較為理想的分頁(yè)查詢實(shí)現(xiàn)方案。經(jīng)過(guò)測(cè)試,查詢4百萬(wàn)條數(shù)據(jù),可以在3分鐘內(nèi)顯示出首頁(yè)數(shù)據(jù),以后每一次翻頁(yè)操作基本在2秒以內(nèi)。內(nèi)存和cpu占用無(wú)明顯增長(zhǎng)。
 
本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/sytigeryhl/archive/2009/03/19/4003623.aspx

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多