關(guān)系進(jìn)行組合,以形成新的查詢條件,使用新的查詢條件到第一數(shù)據(jù) 文件中進(jìn)行查詢。例如,將由查詢項(xiàng)"C2>0"改寫的I ine = 0110001與由查詢項(xiàng)"C2〈 = 5"改寫 的line = 1111110進(jìn)行與運(yùn)算,從而獲得新的查詢條件為Iine = OllOOOO,從而將待查詢數(shù) 據(jù)限定在第2和3行數(shù)據(jù)中。
[0129] 進(jìn)一步,若未在索引文件中匹配到與查詢項(xiàng)相同的已有查詢項(xiàng),則當(dāng)查詢項(xiàng)表示 數(shù)值范圍時,可以進(jìn)一步判斷在索引文件中是否能夠匹配到數(shù)據(jù)范圍被查詢項(xiàng)包含或包含 查詢項(xiàng)的已有查詢項(xiàng);如果判斷結(jié)果為是,意味著能夠匹配到數(shù)值范圍被查詢項(xiàng)包含或包 含該查詢項(xiàng)的已有查詢項(xiàng),則可以將該查詢項(xiàng)拆分為可改寫部分和不可改寫部分,并根據(jù) 所述匹配到的已有查詢項(xiàng)對應(yīng)的數(shù)據(jù)行指示信息對該可改寫部分進(jìn)行改寫,將不可改寫部 分作為新的查詢項(xiàng)。例如,可以將所述可改寫部分改寫為待查詢數(shù)據(jù)行等于匹配到的已有 查詢項(xiàng)對應(yīng)的數(shù)據(jù)行指示信息所指示的數(shù)據(jù)行。
[0130] 結(jié)合上述表1所示第一數(shù)據(jù)文件和表5所示索引文件為例,以查詢項(xiàng)"C2>3"為例, 在表5中不存在查詢項(xiàng)"C2>3",但是發(fā)現(xiàn)數(shù)值范圍被查詢項(xiàng)"C2>3"包含的已有查詢項(xiàng)"C2> 5",于是將查詢項(xiàng)"C2>3"拆分為可改寫部分"C2>5"和不可改寫部分"3〈C2〈 = 5",并將可改 寫部分"C2>5"改寫為:line = 0000001,而不可改寫部分"3〈C2〈 = 5"作為新的查詢項(xiàng)。與查 詢項(xiàng)"C2 > 3"相比,"3〈 C2〈 = 5"限定的數(shù)據(jù)范圍相對較小,再加上改寫一部分限定的I i n e = 0000001可以進(jìn)一步縮小數(shù)據(jù)范圍,從而有利于減少IO操作,提高查詢效率。
[0131]值得說明的是,在上述舉例中,由于索引文件是按照"〉"或">="的方式進(jìn)行存儲, 所以需要獲取數(shù)值范圍被查詢項(xiàng)包含的已有查詢項(xiàng);若索引文件是按照"〈"或"〈="的方式 進(jìn)行存儲,則需要獲取數(shù)值范圍包含查詢項(xiàng)的已有查詢項(xiàng)。
[0132] 進(jìn)一步,若未能在索引文件中匹配到數(shù)值范圍被查詢項(xiàng)包含或包含該查詢項(xiàng)的已 有查詢項(xiàng),則意味著該查詢項(xiàng)是新的查詢項(xiàng),屬于不可改寫的查詢項(xiàng),可以將該查詢項(xiàng)保持 原樣,同時,在數(shù)據(jù)查詢過程中可以獲取該查詢項(xiàng)對應(yīng)的數(shù)據(jù)行指示信息,然后將該查詢項(xiàng) 以及該查詢項(xiàng)對應(yīng)的數(shù)據(jù)行指示信息對應(yīng)存儲到索引文件中,從而實(shí)現(xiàn)對索引文件的更 新。關(guān)于更新索引文件的過程,可參見前述索引構(gòu)建方法實(shí)施例的描述,其實(shí)質(zhì)相同,在此 不再贅述。
[0133] 為了更加清楚地說明本發(fā)明的有益效果,本發(fā)明發(fā)明人分別對本發(fā)明與現(xiàn)有查詢 方法在真實(shí)場景(ad-hoc查詢頻繁的Gunir系統(tǒng))中進(jìn)行了測試,并得到如圖3所示的效果對 比示意圖。在圖3中,橫坐標(biāo)表示隨著時間逐漸遞增的查詢請求的數(shù)量,而縱坐標(biāo)表示單次 查詢消耗的時間,單位為毫秒(milli-seconds)。在圖3中,下面一條線表示本發(fā)明,上面一 條線表示現(xiàn)有查詢方法。通過圖3可以看出:在查詢速度上,本發(fā)明明顯優(yōu)于現(xiàn)有查詢方法, 另外,隨著查詢請求的不斷增多,索引文件不斷被更新完善,使得查詢速度進(jìn)一步提高,并 最終取向收斂。
[0134]另外,本發(fā)明發(fā)明人還采用國際上通用的TPC-H benchmark對本發(fā)明和業(yè)界同類 系統(tǒng)(MySQL系統(tǒng)中的w/B-Tree方案)進(jìn)行了對比測試,得到如圖4所示的效果對比示意圖。 在圖4中,橫坐標(biāo)表示隨著時間逐漸遞增的查詢請求的數(shù)量,而縱坐標(biāo)表示單次查詢消耗的 時間,單位為毫秒(milli-seconds)。在圖4中,下面一條線表示本發(fā)明,上面一條線表示業(yè) 務(wù)同類系統(tǒng)。通過圖4可以看出:在查詢速度上,本發(fā)明明顯優(yōu)于業(yè)界同類系統(tǒng),另外,隨著 查詢請求的不斷增多,索引文件不斷被更新完善,使得查詢速度進(jìn)一步提高,并最終取向收 斂。
[0135]需要說明的是,對于前述的各方法實(shí)施例,為了簡單描述,故將其都表述為一系列 的動作組合,但是本領(lǐng)域技術(shù)人員應(yīng)該知悉,本發(fā)明并不受所描述的動作順序的限制,因?yàn)?依據(jù)本發(fā)明,某些步驟可以采用其他順序或者同時進(jìn)行。其次,本領(lǐng)域技術(shù)人員也應(yīng)該知 悉,說明書中所描述的實(shí)施例均屬于優(yōu)選實(shí)施例,所涉及的動作和模塊并不一定是本發(fā)明 所必須的。
[0136] 在上述實(shí)施例中,對各個實(shí)施例的描述都各有側(cè)重,某個實(shí)施例中沒有詳述的部 分,可以參見其他實(shí)施例的相關(guān)描述。
[0137] 圖5為本發(fā)明又一實(shí)施例提供的索引構(gòu)建裝置的結(jié)構(gòu)示意圖。如圖5所示,該裝置 包括:請求獲取模塊51、提取模塊52、信息獲取模塊53和索引構(gòu)建模塊54。
[0138] 請求獲取模塊51,用于獲取用于查詢第一數(shù)據(jù)文件的查詢請求。
[0139] 提取模塊52,用于從所述查詢請求的查詢條件中提取至少一個查詢項(xiàng)。
[0140]信息獲取模塊53,用于獲取各查詢項(xiàng)對應(yīng)的數(shù)據(jù)行指示信息,所述數(shù)據(jù)行指示信 息用于指示滿足所述數(shù)據(jù)行指示信息對應(yīng)查詢項(xiàng)的數(shù)據(jù)所在的數(shù)據(jù)行。
[0141] 索引構(gòu)建模塊54,用于將所述各查詢項(xiàng)以及所述各查詢項(xiàng)對應(yīng)的數(shù)據(jù)行指示信息 對應(yīng)存儲在所述第一數(shù)據(jù)文件的索引文件。
[0142] 在一可選實(shí)施方式中,提取模塊52具體用于:
[0143] 以所述查詢條件中的邏輯運(yùn)算符為分隔符,提取所述查詢條件中被所述分隔符分 割出的各部分作為所述查詢項(xiàng)。
[0144] 在一可選實(shí)施方式中,各查詢項(xiàng)包括數(shù)據(jù)列的名稱、運(yùn)算符以及目標(biāo)數(shù)值?;?此,信息獲取模塊53具體用于:
[0145] 根據(jù)所述各查詢項(xiàng)中數(shù)據(jù)列的名稱,從所述第一數(shù)據(jù)文件中讀取所述各查詢項(xiàng)對 應(yīng)的數(shù)據(jù)列;
[0146] 根據(jù)所述各查詢項(xiàng)中的運(yùn)算符和目標(biāo)數(shù)值,確定所述各查詢項(xiàng)對應(yīng)的數(shù)據(jù)列中滿 足相應(yīng)查詢項(xiàng)的數(shù)據(jù)所在的數(shù)據(jù)行;
[0147] 根據(jù)所述各查詢項(xiàng)對應(yīng)的數(shù)據(jù)列中滿足相應(yīng)查詢項(xiàng)的數(shù)據(jù)所在的數(shù)據(jù)行,生成所 述各查詢項(xiàng)對應(yīng)的數(shù)據(jù)行指示信息。
[0148] 在一可選實(shí)施方式中,索引構(gòu)建模塊54具體用于:
[0149] 將所述各查詢項(xiàng)中對應(yīng)相同數(shù)據(jù)列的查詢項(xiàng)以及所述對應(yīng)相同數(shù)據(jù)列的查詢項(xiàng) 對應(yīng)的數(shù)據(jù)行指示信息存儲在所述索引文件的同一區(qū)域內(nèi);
[0150] 其中,在同一區(qū)域內(nèi),所述對應(yīng)相同數(shù)據(jù)列的查詢項(xiàng)以及所述對應(yīng)相同數(shù)據(jù)列的 查詢項(xiàng)對應(yīng)的數(shù)據(jù)行指示信息按照目標(biāo)數(shù)值的大小依次存儲。
[0151] 在一可選實(shí)施方式中,索引構(gòu)建模塊54還用于:在將所述各查詢項(xiàng)以及所述各查 詢項(xiàng)對應(yīng)的數(shù)據(jù)行指示信息對應(yīng)存儲在所述第一數(shù)據(jù)文件的索引文件之前,執(zhí)行以下操 作:
[0152] 對于每個查詢項(xiàng),判斷所述查詢項(xiàng)中的運(yùn)算符是否屬于關(guān)系運(yùn)算符;
[0153] 當(dāng)所述查詢項(xiàng)中的運(yùn)算符屬于關(guān)系運(yùn)算符時,判斷所述查詢項(xiàng)中的運(yùn)算符是否屬 于預(yù)先規(guī)定的可以存儲到所述索引文件中的運(yùn)算符;
[0154] 若判斷結(jié)果為否,則對所述查詢項(xiàng)以及所述查詢項(xiàng)對應(yīng)的數(shù)據(jù)行指示信息進(jìn)行取 反操作,以獲得取反后的查詢項(xiàng)以及所述取反后的查詢項(xiàng)對應(yīng)的數(shù)據(jù)行指示信息。
[0155] 具體的,索引構(gòu)建模塊54用于將取反后的查詢項(xiàng)以及所述取反后的查詢項(xiàng)對應(yīng)的 數(shù)據(jù)行指示信息存儲到索引文件中。
[0156] 在一可選實(shí)施方式中,索引構(gòu)建模塊54具體用于:
[0157] 根據(jù)所述各查詢項(xiàng)中運(yùn)算符和/或目標(biāo)數(shù)值的類型,確定所述各查詢項(xiàng)適用的邏 輯存儲結(jié)構(gòu);
[0158] 按照所述各查詢項(xiàng)適用的邏輯存儲結(jié)構(gòu),將所述各查詢項(xiàng)以及所述各查詢項(xiàng)對應(yīng) 的數(shù)據(jù)行指示信息存儲到所述第一數(shù)據(jù)文件的索引文件。
[0159] 本實(shí)施例提供的索引構(gòu)建裝置,從查詢請求的查詢條件中提取查詢項(xiàng),獲取用于 指示滿足查詢項(xiàng)的數(shù)據(jù)所在數(shù)據(jù)行的數(shù)據(jù)行指示信息,進(jìn)而將查詢項(xiàng)及查詢項(xiàng)對應(yīng)的數(shù)據(jù) 行指示信息作為該數(shù)據(jù)文件的索引存儲到索引文件中,該索引構(gòu)建過程不依賴于數(shù)據(jù)文件 中的數(shù)據(jù)布局,因此不會破壞現(xiàn)有的數(shù)據(jù)布局,實(shí)現(xiàn)相對簡單,為提高查詢效率提供了條 件。
[0160] 圖6為本發(fā)明又一實(shí)施例提供的查詢裝置的結(jié)構(gòu)示意圖。如圖6所示,該查詢裝置 包括:接收模塊61、提取模塊62、改寫模塊63和查詢模塊64。
[0161] 接收模塊61,用于接收當(dāng)前用于查詢第一數(shù)據(jù)文件的查詢請求。
[0162] 提取模塊62,用于從所述查詢請求的查詢條件中提取至少一個查詢項(xiàng)。
[0163] 改寫模塊63,用于根據(jù)所述第一數(shù)據(jù)文件的索引文件中存儲的已有查詢項(xiàng)和所述 已有查詢項(xiàng)對應(yīng)的數(shù)據(jù)行指示信息,對所述至少一個查詢項(xiàng)中能夠被改寫的查詢項(xiàng)進(jìn)行改 寫;所述數(shù)據(jù)行指示信息用于指示滿足所述已有查詢項(xiàng)的數(shù)據(jù)所在的數(shù)據(jù)行。
[0164] 查詢模塊64,用于根據(jù)所述至少一個查詢項(xiàng)中被改寫的查詢項(xiàng)和未被改寫的查詢 項(xiàng),在所述第一數(shù)據(jù)文件中進(jìn)行查詢,以獲取待查詢的數(shù)據(jù)。
[0165] 在一可選實(shí)施方式中,改寫模塊63具體用于:
[0166] 對于所述至少一個查詢項(xiàng)中的每個查詢項(xiàng),將所述查詢項(xiàng)在所述索引文件中進(jìn)行 匹配;
[0167] 若在所述索引文件中匹配到與所述查詢項(xiàng)相同的已有查詢項(xiàng),則根據(jù)所述匹配到 的已有查詢項(xiàng)對應(yīng)的數(shù)據(jù)行指示信息對所述查詢項(xiàng)進(jìn)行改寫。
[0168] 在一可選實(shí)施方式中,改寫模塊63還用于:
[0169] 若在所述索引文件中未匹配到與所述查詢項(xiàng)相同的已有查詢項(xiàng),當(dāng)所述查詢項(xiàng)表 示數(shù)值范圍時,判斷在所述索引文件中是否能夠匹配到數(shù)據(jù)范圍被所述查詢項(xiàng)包含或包含 所述查詢項(xiàng)的已有查詢項(xiàng);
[0170] 若判斷結(jié)果為是,則根據(jù)所述匹配到的已有查詢項(xiàng)表示的數(shù)值范圍和所述查詢項(xiàng) 表示的數(shù)值范圍,將所述查詢項(xiàng)拆分為可改寫部分和不可改寫部分,并根據(jù)所述匹配到的 已有查詢項(xiàng)對應(yīng)的數(shù)據(jù)行指示信息對所述可改寫部分進(jìn)行,將所述不可改寫部分作為新的 查詢項(xiàng)。
[0171] 在一可選實(shí)施方式中,如圖7所示,該查詢裝置還包括:更新模塊64。
[0172] 更新模塊64,用于在上述判斷結(jié)果為否時,獲取所述查詢項(xiàng)對應(yīng)的數(shù)據(jù)行指示信 息,并將所述查詢項(xiàng)以及所述查詢項(xiàng)對應(yīng)的數(shù)據(jù)行指示信息對應(yīng)存儲到所述索引文件。
[0173] 本實(shí)施例提供的查詢裝置,可基于前述實(shí)施例提供的索引文件進(jìn)行數(shù)據(jù)查詢,在 使用索引文件進(jìn)行數(shù)據(jù)查詢過程中,根據(jù)索引文件中存儲的已有查詢項(xiàng)和已有查詢項(xiàng)對應(yīng) 的數(shù)據(jù)行指示信息,對當(dāng)前查詢條件中能夠被改寫的查詢項(xiàng)進(jìn)行改寫,使得改寫后的查詢 條件變得相對簡單,可以減少IO次數(shù),有利于提高查詢效率。
[0174] 所屬領(lǐng)域的技術(shù)人員可以清楚地了解到,為描述的方便和簡潔,上述描述的系統(tǒng), 裝置和單元的具體工作過程,可以參考前述方法實(shí)施例中的對應(yīng)過程,在此不再贅述。
[0175] 在本發(fā)明所提供的幾個實(shí)施例中,應(yīng)該理解到,所揭露的系統(tǒng),裝置和方法,可以 通過其它的方式實(shí)現(xiàn)。例如,以上所描述的裝置實(shí)施例僅僅是示意性的,例如,所述單元的 劃分,僅僅為一種邏輯功能劃分,實(shí)際實(shí)現(xiàn)時可以有另外的劃分方式,例如多個單元或組件 可以結(jié)合或者可以集成到另一個系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點(diǎn),所顯示或 討論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,裝置或單元的間接耦 合或通信連接,