分表分頁(yè)排序查詢方法及裝置的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬于數(shù)據(jù)查詢技術(shù)領(lǐng)域,尤其涉及一種分表分頁(yè)排序查詢方法及裝置。
【背景技術(shù)】
[0002]目前分表分頁(yè)最好的解決技術(shù)是計(jì)算得出符合查詢條件的N張表并分別查詢每張表中滿足條件的記錄數(shù),之后,根據(jù)請(qǐng)求頁(yè)和請(qǐng)求頁(yè)的記錄數(shù),定位到請(qǐng)求頁(yè)所在的表和該表中記錄所處的位置,再根據(jù)表和記錄所處的位置查詢數(shù)據(jù)庫(kù)獲取相應(yīng)的記錄,最后返回結(jié)果至應(yīng)用層,在數(shù)據(jù)訪問層訪問數(shù)據(jù)庫(kù)之前與處理完結(jié)果后都訪問緩存區(qū)域,讀取或保存相應(yīng)數(shù)據(jù),通過分層分頁(yè)查詢,提高了數(shù)據(jù)庫(kù)資源的有效利用,緩解了數(shù)據(jù)庫(kù)系統(tǒng)的壓力。但上述解決技術(shù)有一個(gè)問題,其每次查詢都要查所有的分表記錄數(shù)據(jù),不能對(duì)所有的分表進(jìn)行排序,并按排序后的結(jié)果進(jìn)行分頁(yè)處理,且不能對(duì)多個(gè)分聯(lián)進(jìn)行聯(lián)合查詢。
【發(fā)明內(nèi)容】
[0003]本發(fā)明實(shí)施例的目的在于提供一種分表分頁(yè)排序查詢方法及裝置,旨在解決現(xiàn)有技術(shù)無法對(duì)數(shù)據(jù)的查詢結(jié)果集進(jìn)行排序顯示的問題。
[0004]本發(fā)明實(shí)施例是這樣實(shí)現(xiàn)的,一種分表分頁(yè)排序查詢方法,所述方法包括如下步驟:
[0005]通過預(yù)設(shè)的查詢參數(shù)和分表規(guī)則計(jì)算得到分表二維數(shù)組;所述分表二維數(shù)組的一維數(shù)組為同一查詢參數(shù)值對(duì)應(yīng)的多個(gè)分表;
[0006]根據(jù)預(yù)設(shè)的數(shù)據(jù)結(jié)構(gòu)和所述查詢參數(shù)為所述分表二級(jí)數(shù)組建立本次查詢的查詢結(jié)果集的索引表;所述數(shù)據(jù)結(jié)構(gòu)包括查詢參數(shù)、所述查詢參數(shù)對(duì)應(yīng)的一維數(shù)組內(nèi)每一分表的序號(hào)和行數(shù);
[0007]當(dāng)需要調(diào)取所述索引表內(nèi)待查詢頁(yè)的數(shù)據(jù)時(shí),根據(jù)所述索引表定位該待查詢頁(yè)的數(shù)據(jù)所在的一組或多組分表;
[0008]調(diào)取所述一組或多組分表的數(shù)據(jù),并顯示。
[0009]進(jìn)一步地,所述根據(jù)預(yù)設(shè)的數(shù)據(jù)結(jié)構(gòu)和查詢參數(shù)為分表二級(jí)數(shù)組建立本次查詢的查詢結(jié)果集的索引表包括:
[0010]遍歷分表二維數(shù)組,取每一一維數(shù)組;
[0011]創(chuàng)建HashMap,將每一查詢參數(shù)值作為HashMap的Key,將所述一維數(shù)組中每一查詢參數(shù)值對(duì)應(yīng)的數(shù)據(jù)作為HashMap的Value,得到索引表。
[0012]進(jìn)一步地,所述HashMap的Value為一二維數(shù)組,第一行數(shù)據(jù)為同一查詢參數(shù)值對(duì)應(yīng)的數(shù)據(jù)在每一分表中的行數(shù),第二行數(shù)據(jù)為該分表在分表二維數(shù)組中的下標(biāo)值。
[0013]進(jìn)一步地,所述當(dāng)需要調(diào)取索引表內(nèi)待查詢頁(yè)的數(shù)據(jù)時(shí),根據(jù)索引表定位該查詢頁(yè)的數(shù)據(jù)所在的一組或多組分表包括:
[0014]根據(jù)所述待查詢頁(yè)的序號(hào)和行數(shù),計(jì)算所述待查詢頁(yè)的數(shù)據(jù)所在分表在所述索引表的位置;
[0015]根據(jù)所述待查詢頁(yè)的數(shù)據(jù)所在分表在所述索引表的位置,獲取索引表中待查詢頁(yè)的數(shù)據(jù)所在分表的下標(biāo)值和所述數(shù)據(jù)在該分表內(nèi)的行數(shù)。
[0016]本發(fā)明還提出一種分表分布排序查詢的裝置,所述裝置包括:
[0017]計(jì)算模塊,用于通過預(yù)設(shè)的查詢參數(shù)和分表規(guī)則計(jì)算得到分表二維數(shù)組;所述分表二維數(shù)組的一維數(shù)組為同一查詢參數(shù)值對(duì)應(yīng)的多個(gè)分表;
[0018]建立索引模塊,用于根據(jù)預(yù)設(shè)的數(shù)據(jù)結(jié)構(gòu)和所述查詢參數(shù)為所述分表二級(jí)數(shù)組建立本次查詢的查詢結(jié)果集的索引表;所述數(shù)據(jù)結(jié)構(gòu)包括查詢參數(shù)、所述查詢參數(shù)對(duì)應(yīng)的一維數(shù)組內(nèi)每一分表的序號(hào)和行數(shù);
[0019]定位模塊,用于當(dāng)需要調(diào)取所述索引表內(nèi)待查詢頁(yè)的數(shù)據(jù)時(shí),根據(jù)所述索引表定位該待查詢頁(yè)的數(shù)據(jù)所在的一組或多組分表;
[0020]顯示模塊,用于調(diào)取所述一組或多組分表的數(shù)據(jù),并顯示。
[0021]進(jìn)一步地,所述建立索引模塊包括:
[0022]取數(shù)單元,用于遍歷分表二維數(shù)組,取每一一維數(shù)組;
[0023]創(chuàng)建HashMap單元,用于創(chuàng)建HashMap,將每一查詢參數(shù)值作為HashMap的Key,將所述一維數(shù)組中每一查詢參數(shù)值對(duì)應(yīng)的數(shù)據(jù)作為HashMap的Value,得到索引表。
[0024]進(jìn)一步地,所述HashMap的Value為一二維數(shù)組,第一行數(shù)據(jù)為同一查詢參數(shù)值對(duì)應(yīng)的數(shù)據(jù)在每一分表中的行數(shù),第二行數(shù)據(jù)為該分表在分表二維數(shù)組中的下標(biāo)值。
[0025]進(jìn)一步地,所述定位模塊包括:
[0026]計(jì)算單元,用于根據(jù)所述待查詢頁(yè)的序號(hào)和行數(shù),計(jì)算所述待查詢頁(yè)的數(shù)據(jù)所在分表在所述索引表的位置;
[0027]獲取單元,用于根據(jù)所述待查詢頁(yè)的數(shù)據(jù)所在分表在所述索引表的位置,獲取索引表中待查詢頁(yè)的數(shù)據(jù)所在分表的下標(biāo)值和所述數(shù)據(jù)在該分表內(nèi)的行數(shù)。
[0028]本發(fā)明實(shí)施例可對(duì)查詢結(jié)果集進(jìn)行排序顯示,解決了任何一種分表、排序、分頁(yè)查詢的問題,作為排序列可以是任何的查詢參數(shù),不受限制,分表的規(guī)則也不受限制,因此采用排序索引查詢結(jié)果集定位每一組分表分頁(yè)數(shù)據(jù),速度快,索引數(shù)據(jù)結(jié)構(gòu)精簡(jiǎn),占用內(nèi)存少,通過緩存保存索引數(shù)據(jù),大大減少了數(shù)據(jù)庫(kù)的查詢。本發(fā)明實(shí)施例可以封裝在一起,能用一行代碼處理完所有的功能。
【附圖說明】
[0029]圖1是本發(fā)明實(shí)施例一提供的分表分頁(yè)排序查詢方法的流程圖;
[0030]圖2是本發(fā)明實(shí)施例一提供的分表分頁(yè)排序查詢方法中索引表的示意圖;
[0031]圖3是本發(fā)明實(shí)施例二提供的分表分頁(yè)排序查詢裝置的結(jié)構(gòu)圖;
[0032]圖4是本發(fā)明實(shí)施例二提供的分表分頁(yè)排序查詢裝置中建立索引模塊的結(jié)構(gòu)圖;
[0033]圖5是本發(fā)明實(shí)施例二提供的分表分頁(yè)排序查詢裝置中定位模塊的結(jié)構(gòu)圖。
【具體實(shí)施方式】
[0034]為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖及實(shí)施例,對(duì)本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
[0035]實(shí)施例一
[0036]本發(fā)明實(shí)施例一提供一種分表分頁(yè)排序查詢方法,如圖1所示,本發(fā)明實(shí)施例一的方法包括步驟:
[0037]S1、通過預(yù)設(shè)的查詢參數(shù)和分表規(guī)則計(jì)算得到分表二維數(shù)組;分表二維數(shù)組的一維數(shù)組為同一查詢參數(shù)值對(duì)應(yīng)的多個(gè)分表。
[0038]上述預(yù)設(shè)的查詢參數(shù)可以根據(jù)需要進(jìn)行設(shè)置,在實(shí)際應(yīng)用中可能是餐飲類的價(jià)格、菜品等。通過查詢參數(shù)和分表規(guī)則計(jì)算出所有的多組分表,分別存放于二維數(shù)組中,本發(fā)明實(shí)施例一將該二維數(shù)組稱為分表二維數(shù)組,分表二維數(shù)組的一維數(shù)據(jù)存儲(chǔ)同一次查詢所關(guān)聯(lián)的分表。
[0039]S2、根據(jù)預(yù)設(shè)的數(shù)據(jù)結(jié)構(gòu)和查詢參數(shù)為分表二級(jí)數(shù)組建立本次查詢的查詢結(jié)果集的索引表;數(shù)據(jù)結(jié)構(gòu)包括查詢參數(shù)、所述查詢參數(shù)對(duì)應(yīng)的一維數(shù)組內(nèi)每一分表的序號(hào)和行數(shù)。
[0040]具體地,遍歷分表二維數(shù)組,取得每一個(gè)一維數(shù)組,將一維數(shù)組中的每個(gè)分表替換分組SQL中對(duì)應(yīng)的原始表,并在此分組SQL上加排序和分組的功能即Order by和Group by,分組和排序都是用同一列數(shù)據(jù),該列數(shù)據(jù)稱之為排序列,排序列的值為每一具體的查詢參數(shù)值。
[0041]如圖2所示,設(shè)置一數(shù)據(jù)結(jié)構(gòu)建立本次查詢的查詢結(jié)果集的索引表,可創(chuàng)建HashMap用于存放每組查詢的合并后的索引數(shù)據(jù)。先創(chuàng)建一個(gè)保存總行數(shù)的變量,查詢返回的數(shù)據(jù)是一個(gè)列表,包括查詢參數(shù)值和查詢參數(shù)值對(duì)應(yīng)的二維數(shù)組兩列數(shù)據(jù)。然后遍歷這個(gè)列表,將每一行數(shù)據(jù)合并到HashMap中,即將查詢參數(shù)值相同的數(shù)據(jù)進(jìn)行合并,HashMap的key是查詢參數(shù)值,HashMap的Value是有兩行的二維數(shù)組,存放查詢參數(shù)值對(duì)應(yīng)的索引數(shù)據(jù),即索引二維數(shù)組,第一行存放是同一查詢參數(shù)值對(duì)應(yīng)數(shù)據(jù)在每一分表中的行數(shù),第二行存入該分表在分表二維數(shù)組中的下標(biāo)值。將每一查詢參數(shù)值的行數(shù)累加到總行數(shù)中,遍歷分表二維數(shù)組后,完成將所有索引數(shù)據(jù)存放HashMap中,并計(jì)算出了總行數(shù),再將這個(gè)HashMap和總行數(shù)保存在緩存中,緩存的Key值是分頁(yè)查詢SQL,Value是HashMap和總行數(shù),緩存超時(shí)時(shí)間默認(rèn)是I分種。
[0042]S3、當(dāng)需要調(diào)取索引表內(nèi)待查詢頁(yè)的數(shù)據(jù)時(shí),根據(jù)索引表定位該待查詢頁(yè)的數(shù)據(jù)所在的一組或多組分表;
[0043]當(dāng)需要調(diào)取索引表內(nèi)待查詢頁(yè)的數(shù)據(jù)時(shí),輸入查詢的SQL、待查詢頁(yè)的開始位置和每頁(yè)的行數(shù)。通過SQL從緩存中查出HashMap。創(chuàng)建一個(gè)變量用于記錄已遍歷過的行數(shù),SP變量A。遍歷HashMap的Key值,通過Key值取得對(duì)應(yīng)的Value值,Value值是索引二維數(shù)組。將索引二維數(shù)組的行數(shù)累加,再和變量A相加,將相加后的值存在變量A中。如果變量A的值等于或大于待查詢頁(yè)的開始位置時(shí),記錄下此數(shù)組的下標(biāo),此為開始下標(biāo),再用變量A值減去待查詢頁(yè)的開始位置,得到值再往后累加相應(yīng)的行數(shù),如果等于或大于每頁(yè)的大小,記錄下此數(shù)組的下標(biāo),此下標(biāo)就是結(jié)束下標(biāo),通過開始下標(biāo)和結(jié)束下標(biāo)截取索引二維數(shù)組第二行數(shù)據(jù),截取出來的數(shù)據(jù)是一維組件,它存放是分表二維組件中分表的下標(biāo)值,如此,可從分表二維數(shù)組找出多組分表。如果存在相同的分表,則把它們合平并,并且對(duì)應(yīng)的行數(shù)也累加,累加后的行數(shù)就是一組分表分頁(yè)查詢的行數(shù),再通過開始下標(biāo)和結(jié)束下標(biāo)計(jì)算出每一組分表查詢的開始位置。
[0044]S4、調(diào)取一組或多組分表的數(shù)據(jù),并顯示。
[0045]創(chuàng)建一個(gè)列表存儲(chǔ)每組分表查詢返回的經(jīng)果集,把它叫做結(jié)果集列表,遍歷這些多組分表,把每一組分表替換SQL對(duì)應(yīng)的原始表,通過開始位置和頁(yè)的行數(shù)在SQL上加上分頁(yè)的功能,然后通過SQL進(jìn)行查詢返回結(jié)果集采用快速排序法進(jìn)行排序。依次遍歷完所有的列表后,結(jié)果集列表就是分表排序分頁(yè)查詢的結(jié)果。
[0046]本發(fā)明實(shí)施例一以比較通用的方法解決了任何一種分表、排序、分頁(yè)查詢的問題。排序列是任何的列,不受限制。分表的規(guī)則也不受限制。采用排序索引定位每一組分表分頁(yè)數(shù)據(jù),速度快,索引數(shù)據(jù)結(jié)構(gòu)精簡(jiǎn),占用內(nèi)存少,通過緩存保存索引數(shù)據(jù),減少數(shù)據(jù)庫(kù)的查詢。本發(fā)明的功能可以封裝在一起,能用一行代碼處理完所