專利名稱:一種時(shí)間密集大數(shù)據(jù)量的b/s分區(qū)間分頁查詢方法
技術(shù)領(lǐng)域:
本發(fā)明屬于計(jì)算機(jī)數(shù)據(jù)分析領(lǐng)域,具體涉及一種時(shí)間密集大數(shù)據(jù)量的B/S分區(qū)間分頁查詢方法。
背景技術(shù):
很多領(lǐng)域如金融、電信及大型系統(tǒng)自動化測試等的業(yè)務(wù)數(shù)據(jù)都存儲于數(shù)據(jù)庫中,隨著企業(yè)信息化的發(fā)展,這些數(shù)據(jù)具有如下特點(diǎn)數(shù)據(jù)量大數(shù)據(jù)條目通常可達(dá)到百萬甚至千萬級,占用存儲空間達(dá)到TB級別;
數(shù)據(jù)的時(shí)間相關(guān)性在數(shù)據(jù)庫中,業(yè)務(wù)數(shù)據(jù)以時(shí)間為主鍵;在邏輯上,數(shù)據(jù)具有時(shí)間相關(guān)性,即對數(shù)據(jù)進(jìn)行查詢分析時(shí)以時(shí)間為檢索條件,強(qiáng)調(diào)一段時(shí)間內(nèi)每個(gè)時(shí)間點(diǎn)上的數(shù)據(jù)情況;數(shù)據(jù)的時(shí)間密度大相鄰的兩條數(shù)據(jù)之間的時(shí)間間隔很小,通常在Is鐘以內(nèi)。對已存儲的數(shù)據(jù)進(jìn)行分析時(shí)必然要涉及到大量數(shù)據(jù)的查詢顯示,數(shù)據(jù)的分頁查詢是不可避免會遇到的問題。目前數(shù)據(jù)查詢大多基于B/S(Bix)WSer/Server,瀏覽器端與服務(wù)器端)結(jié)構(gòu),B/S結(jié)構(gòu)是指服務(wù)器端由web服務(wù)器發(fā)放,客戶端由瀏覽器接收的架構(gòu),常用的分頁策略有三類第一類是一次將所有的查詢結(jié)果全部返回到客戶端,翻頁時(shí)在客戶端控制需要顯示的條數(shù)。這類方法只查詢一次數(shù)據(jù)庫,對于結(jié)果集很小的情況比較適用,當(dāng)結(jié)果集很大時(shí)對網(wǎng)絡(luò)帶寬要求極高,因?yàn)橐淮尾樵円獙⑺薪Y(jié)果返回到瀏覽器端,可能會需要幾分鐘才能返回結(jié)果甚至超時(shí),結(jié)果集大時(shí),這類方法對客戶端內(nèi)存的消耗也是不可接受的;第二類是將查詢結(jié)果全部緩存在服務(wù)器端,只需進(jìn)行一次查詢,就可以將所有的檢索結(jié)果都保存下來,翻頁時(shí)只需從緩存在服務(wù)器端的結(jié)果集中取出相應(yīng)的條數(shù)。這類方法的優(yōu)點(diǎn)是查詢數(shù)據(jù)庫次數(shù)少,但是結(jié)果集很大或并發(fā)情況下,緩存結(jié)果將不斷膨脹,對服務(wù)器端的存儲空間占用很大,可能導(dǎo)致存儲空間不夠?qū)е路?wù)器宕機(jī);第三類是每次只返回當(dāng)前頁面需要顯示的條數(shù),翻頁時(shí)再次發(fā)送查詢條件重新進(jìn)行檢索。這類方法可使用三種分頁模型第一種是上下頁分頁模型,就是頁面上只提供“上一頁”、“下一頁”兩個(gè)翻頁功能,用戶只能逐一翻頁,這種分頁模型的缺陷是對于用戶而言跳頁很不方便;第二種是應(yīng)用最廣泛的窗口型分頁模型,其基本模式就是根據(jù)當(dāng)前頁碼把附近的幾頁都作為鏈接放在頁面上,這種方式在獲取一頁數(shù)據(jù)的時(shí)候通常需要先獲取所有符合條件的數(shù)據(jù),然后再取出相應(yīng)頁的數(shù)據(jù)從數(shù)據(jù)庫返回,對大數(shù)據(jù)量時(shí)時(shí)間開銷較大;第三種是隨意型分頁模型,一般是提供一個(gè)文本框讓用戶輸入頁碼,然后直接跳轉(zhuǎn)到該頁,這種方式對用戶而言是最為靈活的,但這種模型單獨(dú)使用的實(shí)際意義并不是很大,一般是在前兩種分頁模型中加入任意頁跳轉(zhuǎn)功能。由于數(shù)據(jù)的時(shí)間密度大,以Is —條為例,一天的數(shù)據(jù)量有24*60*60=86400條,而很多查詢分析需查詢多天的數(shù)據(jù)以分析其變化趨勢,以10天為例,查詢結(jié)果將達(dá)到864000條,假設(shè)一條數(shù)據(jù)占用Ik的存儲空間,一次查詢需占用864M的存儲空間。因此第一類和第二類方法都存在了很大的問題,一方面一次檢索I萬級甚至百萬級數(shù)據(jù)需要的查詢時(shí)間過長,這樣的響應(yīng)速度是不可接受的,另一方面,每個(gè)用戶多次查詢時(shí),第一類方法對客戶端內(nèi)存的消耗程度是不可接受的,第二類方法對服務(wù)器端存儲空間提出了很大的挑戰(zhàn),需要大量的存儲空間。第三類方法在每次翻頁時(shí)都需發(fā)送查詢條件重新進(jìn)行查詢,由于數(shù)據(jù)的時(shí)間相關(guān)性,查詢時(shí)希望的顯示順序?yàn)榘磿r(shí)間順序遞增或遞減,而從數(shù)據(jù)庫中SELECT出來的順序依賴于DBMS (數(shù)據(jù)庫管理系統(tǒng))對數(shù)據(jù)的物理存儲,與數(shù)據(jù)插入順序無關(guān),且數(shù)據(jù)插入順序也不完全與時(shí)間順序一致,因此SELECT無法保證結(jié)果集按照時(shí)間排序,唯一的方式是使用顯示的排序如Order By子句,這類方法必須先檢索出所有符合條件的記錄并將其排序,當(dāng)結(jié)果集數(shù)據(jù)很大時(shí),排序的時(shí)間將無法忍受。
發(fā)明內(nèi)容
本發(fā)明要解決的問題是針對存儲于數(shù)據(jù)庫中的海量時(shí)間序列數(shù)據(jù),查詢結(jié)果中,每個(gè)時(shí)間點(diǎn)對應(yīng)一條結(jié)果數(shù)據(jù),對于指定的較長的時(shí)間區(qū)間需查詢多個(gè)數(shù)據(jù)庫表,傳統(tǒng)的基于B/S架構(gòu)的查詢方法無法在合理的響應(yīng)時(shí)間內(nèi)返回查詢結(jié)果。本發(fā)明提出了一種時(shí)間 密集大數(shù)據(jù)量的B/S分區(qū)間分頁查詢方法。一種時(shí)間密集大數(shù)據(jù)量的B/S分區(qū)間分頁查詢方法,由用戶通過瀏覽器端輸入初始查詢條件,在請求某一頁或某一區(qū)間時(shí),服務(wù)器端根據(jù)以下步驟獲取請求結(jié)果數(shù)據(jù)步驟I :收集用戶輸入的數(shù)據(jù)庫查詢條件,放入查詢條件queryCondition中,獲取每個(gè)區(qū)間包含的最多頁數(shù)cacheSize,每頁包含的最多數(shù)據(jù)條目數(shù)pageSize,及兩條數(shù)據(jù)間最短時(shí)間間隔span (ms);用intervalTimeNum表示cacheSize*pageSize的值,即每個(gè)區(qū)間最多的結(jié)果條目數(shù)。所述的查詢條件queryCondition為一數(shù)據(jù)結(jié)構(gòu),設(shè)置的參數(shù)包括期望查詢的數(shù)據(jù)的起始時(shí)間startTime、結(jié)束時(shí)間endTime、期望查詢的參數(shù)編號、期望查詢的數(shù)據(jù)頁page、當(dāng)前已查詢過的區(qū)間集合qlntervals、本次查詢的查詢編號qNum以及當(dāng)前查詢區(qū)間的總頁數(shù)pageNum,除pageNum僅在后臺設(shè)置和使用外,其他參數(shù)均由前臺設(shè)置并傳遞到后臺。當(dāng)前查詢的頁page=queryCondition. page,當(dāng)前查詢編號qNum=queryConditon. qNum ;首次請求,默認(rèn) queryCondition. page 為 1,查詢的區(qū)間從 I 開始編號。步驟2 :設(shè)置用戶本次查詢的緩存文件qNum. txt存放于we b服務(wù)器下該用戶的目錄中,用fil印ath表示文件的完整路徑;緩存文件qNum. txt的每行對應(yīng)已查詢過的區(qū)間的一頁數(shù)據(jù)的起始時(shí)間和結(jié)束時(shí)間以及該頁所屬區(qū)間編號,每行的格式為第一個(gè)時(shí)間,最后一個(gè)時(shí)間,所屬區(qū)間。步驟3 :根據(jù)當(dāng)前查詢的頁page及cacheSize,獲得當(dāng)前頁所在的區(qū)間interval interval= (page-1) /cacheSize+1,然后判斷是否是第一次查詢該區(qū)間,若是,執(zhí)行步驟4 ;若否,根據(jù)步驟2中的filepath,打開本次查詢對應(yīng)的緩存文件,定位到當(dāng)前頁所對應(yīng)的行(緩存文件的第page行),讀出該行數(shù)據(jù),將該行中記錄的第一個(gè)時(shí)間賦值給queryConditon. startTime,第二個(gè)時(shí)間賦值給查詢條件的結(jié)束時(shí)間queryCondition.endTime,轉(zhuǎn)到步驟10執(zhí)行。步驟4 :若page=l (第一次查詢第一個(gè)區(qū)間時(shí)),直接轉(zhuǎn)到步驟5執(zhí)行。若page>l(用戶請求查詢下一區(qū)間時(shí)),則從本次查詢的緩存文件中讀出上一區(qū)間最后一頁的結(jié)束時(shí)間,即文件中第page-Ι行中的結(jié)束時(shí)間,然后設(shè)置查詢條件的開始時(shí)間queryCondition.startTime為上一區(qū)間最后一頁的結(jié)束時(shí)間+span (ms),然后執(zhí)行步驟5。若page〈l,返回有O條數(shù)據(jù)的結(jié)果集,本次請求結(jié)束。步驟5 :根據(jù)查詢條件queryCondition進(jìn)行查詢分解,構(gòu)造SQL語句,去每個(gè)相關(guān)的數(shù)據(jù)庫表中分別獲取符合查詢條件的最小的前intervalTimeNum個(gè)時(shí)間點(diǎn)。步驟6:將步驟5得到的所有時(shí)間點(diǎn)集合進(jìn)行歸并排序,結(jié)果放入臨時(shí)數(shù)組tempTimeArray中;若tempTimeArray中有O個(gè)時(shí)間點(diǎn),貝U返回有O條數(shù)據(jù)的結(jié)果集,本次請求結(jié)束,否則執(zhí)行步驟7。步驟7 :用length表示tempTimeArray中時(shí)間點(diǎn)個(gè)數(shù),size表示當(dāng)前區(qū)間總數(shù) 據(jù)條數(shù),若 length>=intervalTimeNum,則 size=intervalTimeNum,當(dāng)前區(qū)間有 cacheSize頁;否貝1J,size=length,若 size%pageSize=0,則當(dāng)前區(qū)間有 size/pageSize 頁,若size%pageSize幸O,則當(dāng)前區(qū)間有size/pageSize+Ι頁。將當(dāng)前區(qū)間的總頁數(shù)暫存于查詢條件 queryCondition. pageNum 中。步驟8 :根據(jù)步驟2中得到的fil印ath,打開緩存文件,根據(jù)步驟6中記錄的臨時(shí)數(shù)組tempTimeArray,以追加的方式在緩存文件中順序?qū)懭氘?dāng)前區(qū)間每一頁第一條數(shù)據(jù)和最后一條數(shù)據(jù)的時(shí)間點(diǎn),并記錄每一頁所屬的區(qū)間,格式為“本頁第一個(gè)時(shí)間,本頁最后一個(gè)時(shí)間,所屬區(qū)間”。具體第i (i從I遞增到queryCondition. pageNum)頁的第一個(gè)時(shí)間為tempTimeArray [ (i_l)氺pageSize],若 l<=i<queryCondition. pageNum,則最后一個(gè)時(shí)間為 tempTimeArray [i*pageSize_l],若 i=queryCondition. pageNum,貝[I 最后一個(gè)時(shí)間為tempTimeArray[size-Ι]。步驟9 :將查詢條件中的開始時(shí)間queryCondition. startTime設(shè)置為當(dāng)前區(qū)間第一頁的第一個(gè)時(shí)間,結(jié)束時(shí)間queryCondition. endTime設(shè)置為當(dāng)前區(qū)間第一頁的最后一個(gè)時(shí)間;當(dāng)前區(qū)間第一頁第一個(gè)時(shí)間和最后一個(gè)時(shí)間的獲取方法參見步驟8中的說明。步驟10 :根據(jù)查詢條件queryCondition進(jìn)行查詢分解,構(gòu)造SQL語句,去每個(gè)相關(guān)的數(shù)據(jù)表中分別獲取數(shù)據(jù)。步驟11 :將步驟10中得到的所有數(shù)據(jù)集進(jìn)行結(jié)果拼接,不同數(shù)據(jù)集相同時(shí)間點(diǎn)的數(shù)據(jù)拼接到一條結(jié)果數(shù)據(jù)中,保存在以時(shí)間點(diǎn)為key,該時(shí)間點(diǎn)上的結(jié)果數(shù)據(jù)為value值的哈希表resHash中;每條結(jié)果數(shù)據(jù)也是一個(gè)哈希表,以結(jié)果集列名為key,結(jié)果數(shù)據(jù)在該列上的值為value。步驟12 :將步驟11中所得的resHash構(gòu)造成最終返回到前臺的結(jié)果列表resList ;判斷是否是第一次查詢當(dāng)前區(qū)間,若是,將該區(qū)間的總頁數(shù)即步驟7中所得的queryCondition. pageNum插入resList的第一條數(shù)據(jù)前,然后執(zhí)行步驟13 ;若否,直接執(zhí)行步驟13。步驟13 :將步驟12中所得的結(jié)果列表resList返回前臺顯示,本次請求結(jié)束。所述步驟I到步驟13中,所有涉及對查詢條件queryConditon的屬性的修改都屬于后臺服務(wù)器端中的修改,不影響前臺web客戶端接收到的初始查詢條件。前臺web客戶端的初始查詢條件由用戶發(fā)起一次新的查詢時(shí)提供,此后,請求每一頁或每一區(qū)間時(shí),前臺web客戶端通過修改查詢條件中的queryConditon. page來請求數(shù)據(jù)。此外,前臺web客戶端還負(fù)責(zé)記錄已查詢過的區(qū)間集合,并將其提供給后臺服務(wù)器端,放入查詢條件queryConditon中的已查詢區(qū)間集合qlnervals中。第一次查詢某一區(qū)間時(shí),后臺會返回該區(qū)間有多少頁,前臺記錄每個(gè)區(qū)間對應(yīng)的頁數(shù)信息用以顯示該區(qū)間中的頁碼序列。本發(fā)明一種時(shí)間密集大 數(shù)據(jù)量的B/S分區(qū)間分頁查詢方法的優(yōu)點(diǎn)在于(I)響應(yīng)速度快采用緩存每頁開始時(shí)間和結(jié)束時(shí)間的方法,獲取每頁數(shù)據(jù)時(shí)給定時(shí)間區(qū)間,這樣會很大程度減小每次查詢的結(jié)果集,從而大大減少了查詢數(shù)據(jù)庫的響應(yīng)時(shí)間;采用分別查詢每個(gè)數(shù)據(jù)庫表,再根據(jù)時(shí)間點(diǎn)拼接數(shù)據(jù)的方法,比多數(shù)據(jù)表連接查詢具有更好的響應(yīng)速度;(2)極大減輕了應(yīng)用服務(wù)器和web客戶端的存儲壓力由于每次只獲取和返回一頁的數(shù)據(jù),極大的節(jié)省了應(yīng)用服務(wù)器及web客戶端的內(nèi)存;應(yīng)用服務(wù)器中只緩存每頁的開始時(shí)間和結(jié)束時(shí)間,而不是存儲所有的查詢結(jié)果數(shù)據(jù),極大減輕了應(yīng)用服務(wù)器的存儲壓力;(3)提高系統(tǒng)穩(wěn)定性每次查詢對應(yīng)用服務(wù)器的內(nèi)存要求不高,且數(shù)據(jù)緩存的方法使得平均處理步驟減少即降低對應(yīng)用服務(wù)器CPU的占用率,從而提高了應(yīng)用服務(wù)器的穩(wěn)定性;每次查詢對客戶端內(nèi)存占用少,從而提高了 web客戶端的穩(wěn)定性;(4)用戶友好性方便用戶進(jìn)行上一區(qū)間、下一區(qū)間、上一頁、下一頁及特定頁數(shù)據(jù)查詢。
圖I為本發(fā)明分區(qū)間分頁查詢方法的步驟流程圖;圖2為本發(fā)明實(shí)施例的系統(tǒng)架構(gòu)圖;圖3為本發(fā)明實(shí)施例中數(shù)據(jù)表結(jié)構(gòu)的示意圖;圖4為本發(fā)明實(shí)施例查詢結(jié)果的示意圖I ;圖5為本發(fā)明實(shí)施例查詢結(jié)果的示意圖2。
具體實(shí)施例方式本發(fā)明的目的在于提出一種時(shí)間密集大數(shù)據(jù)量的B/S分區(qū)間分頁查詢方法,該方法對所有查詢的數(shù)據(jù)進(jìn)行分區(qū)間和分頁,每次查詢一個(gè)新區(qū)間時(shí),僅獲取該區(qū)間中所有數(shù)據(jù)的時(shí)間信息,然后在服務(wù)器端緩存每頁數(shù)據(jù)的起始時(shí)間和結(jié)束時(shí)間,具體查詢每一頁數(shù)據(jù)時(shí),僅需從緩存中讀出該頁的起始時(shí)間和結(jié)束時(shí)間,將查詢范圍限制在一個(gè)很短的時(shí)間范圍內(nèi),并通過查詢分解進(jìn)行分表查詢,然后再按時(shí)間點(diǎn)拼接以獲取最終結(jié)果,很好地解決了查詢響應(yīng)時(shí)間過長和存儲空間浪費(fèi)等問題。下面將結(jié)合附圖和實(shí)施例對本發(fā)明作進(jìn)一步的詳細(xì)說明?,F(xiàn)有一個(gè)航天領(lǐng)域內(nèi)的測試數(shù)據(jù)管理的應(yīng)用系統(tǒng)。該應(yīng)用系統(tǒng)提供的主要功能包括對海量的航天器測試數(shù)據(jù)進(jìn)行數(shù)據(jù)入庫以及數(shù)據(jù)查詢分析。該應(yīng)用系統(tǒng)的數(shù)據(jù)庫中存儲測試數(shù)據(jù)的所有數(shù)據(jù)庫表的表頭格式均為時(shí)間、[參數(shù)I]、[參數(shù)2]、[參數(shù)3]…,即時(shí)間作為主鍵,精確到毫秒,其他列以參數(shù)編號作為列名,如圖3所示,其中,XOOI、X002……、XXXX表示參數(shù)。數(shù)據(jù)庫系統(tǒng)采用OraclelOg數(shù)據(jù)庫。該應(yīng)用系統(tǒng)的B/S架構(gòu)數(shù)據(jù)查詢子系統(tǒng)基于本發(fā)明提出的方法對測試數(shù)據(jù)進(jìn)行查詢并列表顯示。B/S架構(gòu)數(shù)據(jù)查詢子系統(tǒng)如圖2所示,前臺客戶端采用Flex實(shí)現(xiàn),其中通過采用Flex SDK的用戶接口將用戶輸入的數(shù)據(jù)庫查詢條件傳送給WEB服務(wù)器;后臺部署于tomcat服務(wù)器上,采用Java語言實(shí)現(xiàn),WEB服務(wù)器的查詢控制器接收到用戶當(dāng)前輸入的查詢條件后,通過緩存管理在服務(wù)器端緩存要查詢的每頁數(shù)據(jù)的起始時(shí)間和結(jié)束時(shí)間,然后,通過從緩存中讀出具體某頁的起始時(shí)間和結(jié)束時(shí)間,通過SQL構(gòu)造模塊構(gòu)造分表查詢的SQL語句進(jìn)行數(shù)據(jù)庫查詢,再按時(shí)間點(diǎn)拼接以獲取最終結(jié)果,返回給客戶端;前后臺數(shù)據(jù)通信采用第三方基于服務(wù)器的Java遠(yuǎn)程調(diào)用和Web消息傳遞技術(shù)BlazeDS。 實(shí)施例中,緩存文件中的時(shí)間以時(shí)間戳表示,查詢條件中的時(shí)間以Java語言中的Date類型表示,SQL語句中的時(shí)間以時(shí)間格式字符串表示,使用時(shí)應(yīng)根據(jù)情況進(jìn)行相應(yīng)轉(zhuǎn)
換。·實(shí)施例中,結(jié)果數(shù)據(jù)以哈希表表示,用〈> 表示一條哈希表數(shù)據(jù),以(key, value)表示哈希中的一個(gè)鍵值對,例如〈(時(shí)間,2012-08-0600:00:00. 000),(A001, 861) >表示一個(gè)哈希表,該哈希表中存儲了兩個(gè)鍵值對,分別為(時(shí)間,2012-08-0600:00:00. 000)及(A001, 861)。數(shù)據(jù)庫中存儲有7個(gè)月的數(shù)據(jù),本發(fā)明實(shí)施例中用戶本次需要查詢參數(shù)A001、B003、C005和D012的10天的數(shù)據(jù),時(shí)間范圍為2012年08月06日到08月16日。如圖I所示,本發(fā)明一種時(shí)間密集大數(shù)據(jù)量的B/S分區(qū)間分頁查詢的實(shí)現(xiàn)方法如下所示步驟I :收集用戶輸入的數(shù)據(jù)庫查詢條件,放入查詢條件queryCondition中,當(dāng)前查詢的頁 page=queryCondition. page,當(dāng)前查詢的參數(shù)編號 qNum=queryConditon. qNum ;獲取每個(gè)區(qū)間可包含的最多頁數(shù)cacheSize,每頁可包含的最多數(shù)據(jù)條目數(shù)pageSize,及兩條數(shù)據(jù)間最短時(shí)間間隔span (ms)。用intervalTimeNum表示cacheSize*pageSize的值,即每個(gè)區(qū)間最多的結(jié)果條目數(shù)。每個(gè)區(qū)間可包含的最多頁數(shù)cacheSize,及每頁可包含的最多數(shù)據(jù)條目數(shù)pageSize,可由用戶輸入設(shè)置具體數(shù)據(jù)并保存于配置文件中,默認(rèn)值可分別設(shè)置為10和200 ;兩條數(shù)據(jù)間最短時(shí)間間隔為span,單位為毫秒,保存于配置文件中,可根據(jù)具體應(yīng)用進(jìn)行配置,默認(rèn)值可為I (ms)。查詢條件queryCondition主要包括期望查詢的數(shù)據(jù)的起始時(shí)間startTime、結(jié)束時(shí)間endTime、期望查詢的參數(shù)編號、期望查詢的數(shù)據(jù)頁page、當(dāng)前已查詢過的區(qū)間集合qlntervals、本次查詢的查詢編號qNum以及當(dāng)前查詢區(qū)間的總頁數(shù)pageNum。除pageNum僅在后臺服務(wù)器端設(shè)置和使用外,其他參數(shù)均由前臺客戶端設(shè)置并傳遞到后臺服務(wù)器端。查詢條件queryCondition中的已查詢過的區(qū)間集合qlntervals,由瀏覽器端記錄已查詢過的區(qū)間集合并傳遞給服務(wù)器端獲得。本發(fā)明實(shí)施例中,通過設(shè)置期望查詢的數(shù)據(jù)頁獲取一頁數(shù)據(jù),期望查詢的數(shù)據(jù)頁從I開始編號,首次查詢設(shè)置其為1,查詢上一區(qū)間或下一區(qū)間時(shí),設(shè)置其為期望查詢區(qū)間的起始頁編號,起始頁編號計(jì)算方法為page=(期望查詢區(qū)間編號_l)*cacheSize+l,查詢的區(qū)間從I開始編號。本次查詢的查詢編號qNum由前臺提供,從I開始計(jì)數(shù),用戶每進(jìn)行新輸入條件的查詢時(shí),查詢編號增加I。實(shí)施例中,首次查詢,查詢條件中page=l,qNum= I, cacheSize=10, pageSize=200,span=l, intervalTimeNum=2000o步驟2 :設(shè)置用戶本次查詢的緩存文件存放于web服務(wù)器下該用戶的目錄中,文件名為qNum. txt,用filepath表示文件的完整路徑;本發(fā)明實(shí)施例中filePath=’T): \ProgramFiles\Apache Software Foundation\apache-tomcat-6. 0. 18\webapps\QuerySys\cache\defaultUser\l. txt,,。緩存文件qNum. txt存放所有已查詢過的區(qū)間每頁數(shù)據(jù)的起始時(shí)間和結(jié)束時(shí)間以及該頁所屬區(qū)間編號,每頁對應(yīng)緩存文件中的一行,每行的格式為“第一個(gè)時(shí)間(即該頁數(shù)據(jù)的起始時(shí)間),最后一個(gè)時(shí)間(即該頁數(shù)據(jù)的結(jié)束時(shí)間),所屬區(qū)間”,緩存文件中的時(shí)間以時(shí)間戳表示,類型是長整形,所屬區(qū)間以整形數(shù)表示,因此每行緩存字節(jié)數(shù)固定=Iong長度*2+int長度+char長度*3 ;緩存文件的內(nèi)容在步驟8中寫入,由于只有查詢過第i個(gè)區(qū)間才能查詢第i+Ι個(gè)區(qū)間,且每個(gè)區(qū)間中按頁順序?qū)懢彺嫖募?,因此緩存文件中的第page行對應(yīng)于本次查詢的第page頁。步驟3 :根據(jù)當(dāng)前查詢的頁page及cacheSize,獲得當(dāng)前查詢的頁所在的區(qū)間interval :interval= (page-1)/cacheSize+1,若是第一次查詢該區(qū)間,轉(zhuǎn)到步驟4執(zhí)行;否 貝U,根據(jù)步驟2中的filepath,打開本次查詢對應(yīng)的緩存文件,定位到當(dāng)前查詢的頁所對應(yīng)的行(緩存文件qNum. txt的第page行),讀出該行數(shù)據(jù),將該行中記錄的第一個(gè)時(shí)間賦值給查詢條件的開始時(shí)間queryConditon. startTime,第二個(gè)時(shí)間賦值給查詢條件的結(jié)束時(shí)間queryCondition. endTime,轉(zhuǎn)到步驟 10 執(zhí)行。判斷是否是第一次查詢區(qū)間interval的方法是遍歷查詢條件中的已查詢區(qū)間集合queryConditon. qlnervals,查找當(dāng)前區(qū)間interval是否在該集合中,若在,則該區(qū)間已查詢過,若不在該集合中,則是第一次查詢該區(qū)間的數(shù)據(jù),該區(qū)間未查詢過。本發(fā)明實(shí)施例中,查詢區(qū)間interval=(l_l)/200+l=l,即要查詢第一個(gè)區(qū)間,且是第一次查詢第一個(gè)區(qū)間,轉(zhuǎn)步驟4執(zhí)行。步驟4 :若page=l,也就是第一次查詢第一個(gè)區(qū)間時(shí),直接轉(zhuǎn)到步驟5執(zhí)行。若page>l,即用戶請求查詢下一區(qū)間,貝U從本次查詢的緩存文件中讀出本次要查詢的區(qū)間的上一區(qū)間(interval-Ι)的最后一頁的結(jié)束時(shí)間,即對應(yīng)緩存文件中第(page-Ι)行中的最后一個(gè)時(shí)間endTimegd,然后設(shè)置查詢條件的開始時(shí)間queryCondition. startTime為上一區(qū)間最后一頁(page-Ι)的結(jié)束時(shí)間endTimep^i+span (ms),轉(zhuǎn)到步驟 5 執(zhí)行。若page〈l,返回有O條數(shù)據(jù)的結(jié)果集,本次請求結(jié)束。本發(fā)明實(shí)施例中,page=l,直接執(zhí)行步驟5。步驟5 :根據(jù)查詢條件queryCondition進(jìn)行查詢分解,構(gòu)造SQL語句,去每個(gè)相關(guān)的數(shù)據(jù)庫表中分別獲取符合查詢條件的最小的前intervalTimeNum個(gè)時(shí)間點(diǎn)。實(shí)施例中,根據(jù)查詢條件,需從4個(gè)表分別獲取時(shí)間點(diǎn)參數(shù)A001所在表Tl,參數(shù)B003所在表T2,參數(shù)C005所在表T3,參數(shù)DO12所在表T4,其中,去Tl表獲取符合查詢條件的最小前 2000 個(gè)時(shí)間點(diǎn)的 SQL 語句如下SELECT TIME FROM (SELECT TIME FROM TlffHERETIME BETWEEN to_timestamp(,2012-08-060:0:0,,,yyyy-mm-dd hh24:mi:ss. ff)ANDto_timestamp(,2012-08-160:0:0,,,yyyy-mm-dd hh24:mi:ss. ff' )AND(A001IS NOT NULL)ORDER BY TIME ASC)WHERE R0WNUM<=2000 ;其他三條SQL語句與上述語句相似,只需將表名和參數(shù)名做相應(yīng)替換即可。步驟6 :將步驟5中得到的所有時(shí)間點(diǎn)集合進(jìn)行歸并排序,結(jié)果放入臨時(shí)數(shù)組tempTimeArray中;若tempTimeArray中有O個(gè)時(shí)間點(diǎn),貝U返回有O條數(shù)據(jù)的結(jié)果集,本次請求結(jié)束,否則,執(zhí)行步驟7。實(shí)施例中,對應(yīng)數(shù)據(jù)表Tl,T2,T3,T4,共有4個(gè)時(shí)間點(diǎn)集合,歸并排序后tempTimeArray共有2000個(gè)時(shí)間點(diǎn),按照時(shí)間點(diǎn)排序,從2012-08-0600:00:00至2012-08-0600:16:39每秒鐘一條,然后執(zhí)行步驟7。
步驟7 :用length表示tempTimeArray中時(shí)間點(diǎn)個(gè)數(shù),size表示當(dāng)前區(qū)間總數(shù)據(jù)條數(shù),則tempTimeArray的前size個(gè)時(shí)間點(diǎn)即為當(dāng)前區(qū)間所有數(shù)據(jù)的時(shí)間點(diǎn)。具體是若 length>=intervalTimeNum,則 size=intervalTimeNum,當(dāng)前區(qū)間有 cacheSize頁;否則,size=length,若 size%pageSize=0,則當(dāng)前區(qū)間有 size/pageSize 頁,若size%pageSize幸O,則當(dāng)前區(qū)間有size/pageSize+Ι頁。將當(dāng)前區(qū)間的總頁數(shù)暫存于查詢條件 queryCondition. pageNum 中。實(shí)施例中,Iength=2OOO;由于length=intervalTimeNum=2000,因此 Size=2OOO,queryCondition. pageNum=IO ;步驟8 :根據(jù)步驟2中得到的fil印ath,打開緩存文件,根據(jù)步驟6中記錄的時(shí)間點(diǎn)數(shù)組tempTimeArray,以追加的方式在緩存文件中順序?qū)懭氘?dāng)前區(qū)間每一頁第一條數(shù)據(jù)和最后一條數(shù)據(jù)的時(shí)間點(diǎn),并記錄每一頁所屬的區(qū)間,格式為“本頁第一個(gè)時(shí)間,本頁最后一個(gè)時(shí)間,所屬區(qū)間”。具體第i (i從I遞增到queryCondition. pageNum)頁的第一個(gè)時(shí)間為tempTimeArray [ (i_l)氺pageSize],若 l<=i<queryCondition. pageNum,則最后一個(gè)時(shí)間為 tempTimeArray [i*pageSize_l],若 i=queryCondition. pageNum,貝[I 最后一個(gè)時(shí)間為tempTimeArray[size-Ι]。實(shí)施例中,追加寫入緩存文件中的內(nèi)容為1344182400000, 1344182599000, I1344182600000, 1344182799000, I1344182800000, 1344182999000, I1344183000000, 1344183199000, I1344183200000, 1344183399000, I1344183400000, 1344183599000, I1344183600000, 1344183799000, I1344183800000, 1344183999000, I1344184000000, 1344184199000, I1344184200000, 1344184399000, I分別對應(yīng)第I頁到第10頁的緩存文件,每行中第一個(gè)數(shù)字表示本頁第一條數(shù)據(jù)的時(shí)間戳,第二個(gè)數(shù)字表示本頁最后一條數(shù)據(jù)的時(shí)間戳,第三個(gè)數(shù)字表示本頁所屬區(qū)間。步驟9 :默認(rèn)讀取當(dāng)前區(qū)間的第一頁,將查詢條件中的開始時(shí)間queryCondition.startTime設(shè)置為當(dāng)前區(qū)間第一頁的第一個(gè)時(shí)間,結(jié)束時(shí)間queryCondition. endTime設(shè)置為當(dāng)前區(qū)間第一頁的最后一個(gè)時(shí)間,即將查詢條件中的開始時(shí)間和結(jié)束時(shí)間分別設(shè)置為當(dāng)前(page)頁的數(shù)據(jù)起始和結(jié)束時(shí)間;當(dāng)前區(qū)間第一頁第一個(gè)時(shí)間和最后一個(gè)時(shí)間的獲取方法參見步驟8中的說明。
實(shí)施例中,查詢第I 頁,置 queryCondition. startTime=newData (1344182400000),置 queryCondition. endTime=new Data (1344182599000),分別是第I頁第一個(gè)時(shí)間和最后一個(gè)時(shí)間。步驟10 :根據(jù)查詢條件queryCondition進(jìn)行查詢分解,構(gòu)造SQL語句,去每個(gè)相關(guān)的數(shù)據(jù)表中分別獲取數(shù)據(jù)(獲得每條數(shù)據(jù)的時(shí)間點(diǎn)和相關(guān)數(shù)據(jù))。實(shí)施例中,根據(jù)查詢條件,需從4個(gè)表中分別獲取數(shù)據(jù)參數(shù)A001所在表Tl,參數(shù)B003所在表T2,參數(shù)C005所在表T3,參數(shù)D012所在表T4,其中,去Tl表獲取數(shù)據(jù)的 SQL 語句如下SELECT TIME, A001FR0M Tl WHERE TIME BETWEEN to_timestamp (1 2012-08-0600:00:00. 000’,’yyyy-mm-dd hh24:mi:ss. ff 1 )AND to_timestamp(’2012-08-0600:03:19. 000,,,yyyy-mm-dd hh24:mi:ss. ff)AND(A001 IS NOT null),其中 ’ 2012-08-0600:00:00. 000’ 是 queryConditon. startTime 的字符串表示,’ 2012-08-06 00:03:19. 000’是queryCondition. endTime的字符串表示;其他三條SQL語句與上述語句相似,只需將表名和參數(shù)名稱做相應(yīng)替換即可。步驟11 :將步驟10中得到的所有數(shù)據(jù)集進(jìn)行結(jié)果拼接,不同數(shù)據(jù)集相同時(shí)間點(diǎn)的數(shù)據(jù)拼接到一條結(jié)果數(shù)據(jù)中,保存在以時(shí)間點(diǎn)為key,該時(shí)間點(diǎn)上的結(jié)果數(shù)據(jù)為value值的哈希表resHash中;每條結(jié)果數(shù)據(jù)也是一個(gè)哈希表,以結(jié)果集列名為key,結(jié)果數(shù)據(jù)在該列上的值為value。實(shí)施例中,共拼接得到200條數(shù)據(jù),其中,第一條數(shù)據(jù)的時(shí)間點(diǎn)為 ’ 2012-08-0600:00:00. 000’,第一條數(shù)據(jù)為〈(A001, 861),(B003, 975),(C005, 845),(D012,596)> ;步驟12 :將步驟11中所得的resHash構(gòu)造成最終返回到前臺的結(jié)果列表resList ;若是第一次查詢當(dāng)前區(qū)間,則將該區(qū)間的總頁數(shù)即步驟7中所得的queryCondition. pageNum 插入 resList 的第一條數(shù)據(jù)前。實(shí)施例中,第一次查詢第一個(gè)區(qū)間,resList中共有201條數(shù)據(jù),第一條數(shù)據(jù)存儲當(dāng)前區(qū)間的頁數(shù),為〈(總頁數(shù),10)>,后面200條為第一頁的具體數(shù)據(jù),其中,第一條數(shù)據(jù)為〈(時(shí)間,2012-08-0600:00:00. 000),(A001, 861), (B003, 975), (C005, 845), (D012, 596) > ;步驟13 :將步驟12中所得的結(jié)果列表resList返回前臺顯示,本次請求結(jié)束。實(shí)施例中,將resList返回前臺,前臺需記錄區(qū)間I已查詢過,記錄區(qū)間I包含10頁。本發(fā)明實(shí)施例第一次查詢后,結(jié)果列表的顯示如圖4所示,前臺需記錄區(qū)間I已查詢過,記錄區(qū)間I包含10頁。當(dāng)在區(qū)間內(nèi)點(diǎn)擊查詢某一頁時(shí),在前臺設(shè)置queryConditon.page為相應(yīng)頁碼,后臺根據(jù)本發(fā)明步驟I到步驟13,獲取相應(yīng)頁的數(shù)據(jù)并返回前臺;在圖4情況下,點(diǎn)擊查詢“下一區(qū)間”(即區(qū)間2)時(shí),設(shè)置queryConditon. page=(期望查詢區(qū)間編號_l)*cacheSize+l=(2-l)*10+l=ll,后臺根據(jù)本發(fā)明步驟I到步驟13執(zhí)行,寫第二個(gè)區(qū)間的緩存并返回第11頁的數(shù)據(jù),顯示結(jié)果如圖5所示,前臺收到查詢結(jié)果后需記錄區(qū)間2已查詢過,實(shí)施例中,區(qū)間2包含10頁,因此前臺需記錄區(qū)間2包含10頁;在圖5情況下,點(diǎn)擊查詢“上一區(qū)間”(即區(qū)間I)時(shí),設(shè)置queryConditon. page=(期望查詢區(qū)間編號-l)*cacheSize+l=(l_l)*10+l=l,后臺根據(jù)本發(fā)明步驟I到步驟13執(zhí)行,返回第I頁的數(shù)據(jù),列表顯示結(jié)果如圖4所示。根據(jù)本發(fā)明所述方法完成的航天領(lǐng)域數(shù)據(jù)B/S查詢系統(tǒng)方便用戶查詢下一區(qū)間、上一區(qū)間以及具體每一頁的數(shù)據(jù),系統(tǒng)運(yùn)行穩(wěn)定,且響應(yīng)時(shí)間合理。本發(fā)明的方法的響應(yīng)時(shí)間長短與數(shù)據(jù)表中的數(shù)據(jù)量,查詢的參數(shù)個(gè)數(shù),及最終結(jié)果集大小相關(guān),數(shù)據(jù)表中數(shù)據(jù)量越大,參數(shù)個(gè)數(shù)越多,最終結(jié)果集越大,則響應(yīng)時(shí)間越長。實(shí)際運(yùn)行中,在數(shù)據(jù)表中數(shù)據(jù)量達(dá)到百萬級,參數(shù)個(gè)數(shù)小于50個(gè),最終結(jié)果集大小為十萬級的情況下,平均響應(yīng)時(shí)間小于ls,其中,第一次查詢查詢一個(gè)區(qū)間時(shí)用時(shí)較長,在Isls之 間,其他情況下響應(yīng)時(shí)間均在毫秒級,而不使用本方法的緩存和查詢分解方法的平均響應(yīng)時(shí)間在IOs左右。從本實(shí)施例中可以看出本發(fā)明所述分區(qū)間分頁查詢方法是正確且行之有效的。
權(quán)利要求
1.一種時(shí)間密集大數(shù)據(jù)量的B/S分區(qū)間分頁查詢方法,其特征在于,用戶通過瀏覽器端輸入初始查詢條件,在請求某一頁或某一區(qū)間時(shí),服務(wù)器端根據(jù)以下步驟獲取請求結(jié)果數(shù)據(jù) 步驟I :收集本次用戶在瀏覽器端輸入的查詢條件,放入查詢條件queryCondition中,并獲取每個(gè)區(qū)間包含的最多頁數(shù)cacheSize,每頁包含的最多數(shù)據(jù)條目數(shù)pageSize,以及兩條數(shù)據(jù)間最短時(shí)間間隔span (ms),每個(gè)區(qū)間最多的結(jié)果條目數(shù)intervalTimeNum =cacheSize*pageSize ;所述的查詢條件queryCondition為一數(shù)據(jù)結(jié)構(gòu),設(shè)置的參數(shù)包括期望查詢的數(shù)據(jù)的起始時(shí)間startTime、結(jié)束時(shí)間endTime、期望查詢的參數(shù)編號、期望查詢的數(shù)據(jù)頁page、已查詢過的區(qū)間集合qlntervals、本次查詢的查詢編號qNum、以及本次查詢的區(qū)間的總頁數(shù)PageNum,除pageNum僅在服務(wù)器端設(shè)置和使用外,其他參數(shù)均由瀏覽器端設(shè)置并傳遞到服務(wù)器端;當(dāng)前查詢的頁page=queryCondition. page,當(dāng)前查詢編號qNum = queryCondition. qNum ;首次請求,queryCondition. page 為 I ; 步驟2 :設(shè)置本次查詢的緩存文件qNum. txt存放于web服務(wù)器下該用戶的目錄中,用fiIepath表示文件的完整路徑;緩存文件qNum. txt的每行對應(yīng)已查詢過的區(qū)間的一頁數(shù)據(jù)的起始時(shí)間和結(jié)束時(shí)間以及該頁所屬區(qū)間編號,每行的格式為第一個(gè)時(shí)間,最后一個(gè)時(shí)間,所屬區(qū)間; 步驟3 :根據(jù)當(dāng)前查詢的頁page及cacheSize,獲得當(dāng)前查詢的頁所在的區(qū)間interval : interval= (page-1)/cacheSize+1,然后判斷是否是第一次查詢該區(qū)間,若是,執(zhí)行步驟4 ;若否,打開本次查詢對應(yīng)的緩存文件,定位到第page行,讀出該行數(shù)據(jù),將該行中記錄的第一個(gè)時(shí)間賦值給queryConditon. startTime,第二個(gè)時(shí)間賦值給查詢條件的結(jié)束時(shí)間 queryCondition. endTime,執(zhí)行步驟 10 ; 步驟4 :若page=l,直接執(zhí)行步驟5 ;若page>l,從本次查詢的緩存文件中讀出第page-Ι行中的最后一個(gè)時(shí)間,然后設(shè)置查詢條件的開始時(shí)間queryCondition. startTime為該最后一個(gè)時(shí)間+span (ms),然后執(zhí)行步驟5 ;Spage〈l,返回有O條數(shù)據(jù)的結(jié)果集,本次請求結(jié)束; 步驟5 :根據(jù)查詢條件queryCondition進(jìn)行查詢分解,構(gòu)造SQL語句,去每個(gè)相關(guān)的數(shù)據(jù)庫表中分別獲取符合查詢條件的最小的前intervalTimeNum個(gè)時(shí)間點(diǎn); 步驟6 :將步驟5得到的所有時(shí)間點(diǎn)集合進(jìn)行歸并排序,結(jié)果放入臨時(shí)數(shù)組tempTimeArray中;若tempTimeArray中有O個(gè)時(shí)間點(diǎn),貝U返回有O條數(shù)據(jù)的結(jié)果集,本次請求結(jié)束,否則執(zhí)行步驟7; 步驟7 :用length表示tempTimeArray中時(shí)間點(diǎn)個(gè)數(shù),size表示當(dāng)前區(qū)間總數(shù)據(jù)條數(shù),若 length>=intervalTimeNum,則 size=intervalTimeNum,當(dāng)前區(qū)間有 cacheSize頁;否則,size=length,若 size%pageSize=0,則當(dāng)前區(qū)間有 size/pageSize 頁,若size%pageSize Φ O,則當(dāng)前區(qū)間有size/pageSize+Ι頁,將當(dāng)前區(qū)間的總頁數(shù)暫存于queryCondition. pageNum 中; 步驟8 :打開緩存文件qNum. txt,根據(jù)步驟6記錄的臨時(shí)數(shù)組tempTimeArray,以追加的方式在緩存文件中順序?qū)懭氘?dāng)前區(qū)間每一頁第一條數(shù)據(jù)和最后一條數(shù)據(jù)的時(shí)間點(diǎn),并記錄每一頁所屬的區(qū)間; 具體第i (i從I遞增到queryCondition. pageNum)頁的第一個(gè)時(shí)間為tempTimeArray [ (i_l)氺pageSize],若 l<=i<queryCondition. pageNum,則最后一個(gè)時(shí)間為 tempTimeArray [i*pageSize_l],若 i=queryCondition. pageNum,貝[I 最后一個(gè)時(shí)間為tempTimeArray[size-Ι]; 步驟9 :將查詢條件中的開始時(shí)間queryCondition. startTime設(shè)置為當(dāng)前區(qū)間第一頁的第一個(gè)時(shí)間,結(jié)束時(shí)間queryCondition. endTime設(shè)置為當(dāng)前區(qū)間第一頁的最后一個(gè)時(shí)間; 步驟10 :根據(jù)查詢條件queryCondition進(jìn)行查詢分解,構(gòu)造SQL語句,去每個(gè)相關(guān)的數(shù)據(jù)表中分別獲取數(shù)據(jù); 步驟11 :將得到的所有數(shù)據(jù)集進(jìn)行結(jié)果拼接,不同數(shù)據(jù)集相同時(shí)間點(diǎn)的數(shù)據(jù)拼接到一條結(jié)果數(shù)據(jù)中,保存在以時(shí)間點(diǎn)為key,該時(shí)間點(diǎn)上的結(jié)果數(shù)據(jù)為value值的哈希表resHash中;每條結(jié)果數(shù)據(jù)也是一個(gè)哈希表,以結(jié)果集列名為key,結(jié)果數(shù)據(jù)在該列上的值為 value ; 步驟12 :將所得的resHash構(gòu)造成最終返回到前臺的結(jié)果列表resList ;判斷是否是第一次查詢當(dāng)前區(qū)間,若是,將該區(qū)間的總頁數(shù)queryCondition. pageNum插入resList的第一條數(shù)據(jù)前,然后執(zhí)行步驟13,若否,直接執(zhí)行步驟13 ; 步驟13 :將結(jié)果列表resList返回前臺顯示,本次請求結(jié)束。
2.根據(jù)權(quán)利要求I所述的分區(qū)間分頁查詢方法,其特征在于,步驟I中所述的當(dāng)前查詢的頁page從I開始編號,請求某一區(qū)間時(shí),其編號的計(jì)算方法為page=(期望查詢區(qū)間編號_l)*cacheSize+l,查詢的區(qū)間從I開始編號。
3.根據(jù)權(quán)利要求I所述的分區(qū)間分頁查詢方法,其特征在于,步驟I所述的每個(gè)區(qū)間包含的最多頁數(shù)cacheSize的默認(rèn)值為10,每頁包含的最多數(shù)據(jù)條目數(shù)pageSize的默認(rèn)值為200,兩條數(shù)據(jù)間最短時(shí)間間隔span的默認(rèn)值為I (ms)。
4.根據(jù)權(quán)利要求I所述的分區(qū)間分頁查詢方法,其特征在于,步驟3和步驟12中所述的判斷是否是第一次查詢當(dāng)前區(qū)間的方法是遍歷查詢條件中的已查詢區(qū)間集合queryConditon. qlnervals,查找當(dāng)前區(qū)間是否在該集合中,若在,則該區(qū)間已查詢過,否貝U,該區(qū)間未查詢過。
5.根據(jù)權(quán)利要求I所述的分區(qū)間分頁查詢方法,其特征在于,步驟I中所述的查詢條件queryCondition中的已查詢過的區(qū)間集合qlntervals,由瀏覽器端記錄已查詢過的區(qū)間集合并傳遞給服務(wù)器端獲得。
全文摘要
本發(fā)明提出了一種時(shí)間密集大數(shù)據(jù)量的B/S分區(qū)間分頁查詢方法。用戶通過瀏覽器端輸入初始查詢條件,請求某一頁或某一區(qū)間。首次查詢某區(qū)間,在服務(wù)器端獲取該區(qū)間的所有時(shí)間點(diǎn),根據(jù)時(shí)間點(diǎn)個(gè)數(shù)獲取本區(qū)間的總頁數(shù)并以追加的方式將每頁的起始時(shí)間和結(jié)束時(shí)間順序?qū)懭刖彺嫖募?,根?jù)第一頁的起始時(shí)間和結(jié)束時(shí)間,獲取該頁數(shù)據(jù),將本區(qū)間的總頁數(shù)及第一頁數(shù)據(jù)返回前臺。對查詢過的區(qū)間,只需從緩存文件中讀出要查詢的頁的開始時(shí)間和結(jié)束時(shí)間,根據(jù)該時(shí)間條件從數(shù)據(jù)庫中查詢該頁的數(shù)據(jù)并返回。通過分表查詢數(shù)據(jù)庫,再按時(shí)間點(diǎn)拼接以獲取最終結(jié)果。本發(fā)明減小了每次查詢的結(jié)果集,減少了查詢數(shù)據(jù)庫的響應(yīng)時(shí)間,占用客戶端和應(yīng)用服務(wù)器存儲空間少。
文檔編號G06F17/30GK102880685SQ201210338858
公開日2013年1月16日 申請日期2012年9月13日 優(yōu)先權(quán)日2012年9月13日
發(fā)明者李倩倩, 呂江花, 田徑, 文喬, 馬世龍 申請人:北京航空航天大學(xué)