table where C2>5;
[0094] Q2:select......from table where Cl contains(A';
[0095] Q3:select......from table where C2>0 and C2< = 5;
[0096] 假設初始階段,第一數(shù)據(jù)文件的索引文件為空(null);當獲取到QO時,從QO中提取 出查詢項"C2>0",確定滿足查詢項"C2>0"的數(shù)據(jù)所在的數(shù)據(jù)行,然后生成數(shù)據(jù)行指示信息, 將查詢項"C2>0"以及對應的數(shù)據(jù)行指示信息存儲到索引文件中,此時的索引文件如下表3 所示。在該實例中
[0097] 使用bit-map這一數(shù)據(jù)存儲結構。表3
[0099]接下來,獲取到Ql,從Ql中提取出查詢項"C2>5",確定滿足查詢項"C2>5"的數(shù)據(jù)所 在的數(shù)據(jù)行,然后生成數(shù)據(jù)行指示信息,將查詢項"C2>5"以及對應的數(shù)據(jù)行指示信息存儲 到索引文件中,此時的索引文件如下表4所示。
[0100]表4
[0102] 接下來,獲取到Q2,從Q2中提取出查詢項"Cl contains'A'",確定滿足查詢項"Cl contains'A'"的數(shù)據(jù)所在的數(shù)據(jù)行,然后生成數(shù)據(jù)行指示信息,將查詢項"Cl contains 'A'"以及對應的數(shù)據(jù)行指示信息存儲到索引文件中,此時的索引文件如下表5所示。
[0103] 表5
[0105] 接下來,獲取到Q3,從Q3中提取出查詢項"C2>0"和"C2〈 = 5",確定滿足查詢項"C2> 〇"的數(shù)據(jù)所在的數(shù)據(jù)行,然后生成數(shù)據(jù)行指示信息,將查詢項"C2>0"以及對應的數(shù)據(jù)行指 示信息存儲到索引文件中,此時,會發(fā)現(xiàn)查詢項"C2>0"及對應的數(shù)據(jù)行指示信息已經(jīng)存在 于索引文件中,故可以將其丟棄。而關于查詢項"〇2〈 = 5",確定滿足查詢項"02〈 = 5"的數(shù)據(jù) 所在的數(shù)據(jù)行,然后生成數(shù)據(jù)行指示信息,將查詢項"C2〈 = 5"以及對應的數(shù)據(jù)行指示信息 存儲到索引文件中,由于查詢項"C2〈 = 5"不符合預設的存儲要求,于是可以對查詢項"C2〈 =5"及對應的數(shù)據(jù)行指示信息進行取反操作,從而獲得查詢項"C2>5"以及對應的數(shù)據(jù)行指 示信息,此時會發(fā)現(xiàn)查詢項"C2>5"以及對應的數(shù)據(jù)行指示信息已經(jīng)存在于索引文件中,于 是可以將其丟棄。在處理完Q〇、Ql和Q2之后可以得到如表5所示的索引文件。
[0106]另外,在上述處理Q3的過程中可以發(fā)現(xiàn),隨著索引文件中查詢項及其對應的數(shù)據(jù) 行指示信息的不斷逐漸增多,有可能會出現(xiàn)重復的查詢項及數(shù)據(jù)行指示信息,為了節(jié)約處 理資源,提高構建索引的效率,可以在獲取各查詢項對應的數(shù)據(jù)行指示信息之前,先將提取 到的各查詢項在已構建的索引文件中進行匹配,如果在索引文件中匹配到該查詢項,則結 束對該查詢項的處理并進入對下一個查詢項的處理過程;如果在索引文件中未匹配到該查 詢項,則繼續(xù)執(zhí)行獲取該查詢項對應的數(shù)據(jù)行指示信息以及后續(xù)操作。
[0107] 進一步,有可能對查詢項進行取反操作之后,與索引文件中已有的查詢項存在重 復,為了節(jié)約處理資源,提高構建索引的效率,可以在獲取各查詢項對應的數(shù)據(jù)行指示信息 之前,可以對提取到的各查詢項進行取反操作,將取反后的查詢項在索引文件中進行匹配; 如果在索引文件中匹配到該取反后的查詢項,則結束對該查詢項的處理并進入對下一個查 詢項的處理過程;如果在索引文件中未匹配到該取反后的查詢項,則繼續(xù)執(zhí)行獲取該查詢 項對應的數(shù)據(jù)行指示信息以及后續(xù)操作。
[0108] 關于本實施例中的查詢項和查詢項對應的數(shù)據(jù)行指示信息在作為索引時是否能 夠提高查詢速度,以及在應用過程中對索引文件進行更新的過程將在下面實施例中進行描 述。
[0109] 圖2為本發(fā)明另一實施例提供的查詢方法的流程示意圖。如圖2所示,該方法包括:
[0110] 201、接收當前用于查詢第一數(shù)據(jù)文件的查詢請求。
[0111] 202、從查詢請求的查詢條件中提取至少一個查詢項。
[0112] 203、根據(jù)第一數(shù)據(jù)文件的索引文件中存儲的已有查詢項和已有查詢項對應的數(shù) 據(jù)行指示信息,對至少一個查詢項中能夠被改寫的查詢項進行改寫;所述數(shù)據(jù)行指示信息 用于指示滿足已有查詢項的數(shù)據(jù)所在的數(shù)據(jù)行。
[0113] 204、根據(jù)至少一個查詢項中被改寫的查詢項和未被改寫的查詢項,在第一數(shù)據(jù)文 件中進行查詢,以獲取待查詢的數(shù)據(jù)。
[0114] 本實施例的執(zhí)行可基于前述各方法實施例給出的索引文件。關于相關數(shù)據(jù)的定義 或解釋可參見前述實施例中的描述,在此不再贅述。
[0115] 在此說明,可以預先構建索引文件,然后基于所構建的索引文件進行數(shù)據(jù)查詢;或 者,也可以將構建索引文件的過程與數(shù)據(jù)查詢過程糅合在一起,即基于已構建的索引文件 進行數(shù)據(jù)查詢,并在數(shù)據(jù)查詢過程中不斷完善索引文件。
[0116] 在本實施例中,假設在獲取當前用于查詢第一數(shù)據(jù)文件的查詢請求之前,已經(jīng)存 在索引文件,該索引文件可以是預先離線形成的,也可以是在之前的數(shù)據(jù)查詢過程中在線 形成的。則基于索引文件的數(shù)據(jù)查詢過程具體如下:首先,接收當前用于查詢第一數(shù)據(jù)文件 的查詢請求。在現(xiàn)有技術中,當拿到查詢請求后,會直接根據(jù)查詢請求中的查詢條件,去第 一數(shù)據(jù)文件中讀取查詢條件涉及的各列數(shù)據(jù),當將所需的各列數(shù)據(jù)讀取到內(nèi)存之后,再進 行數(shù)據(jù)篩選等處理,最終獲得所需的數(shù)據(jù)。這會涉及大量IO操作,導致數(shù)據(jù)查詢效率較低。 而本實施例并不像現(xiàn)有技術那樣直接去第一數(shù)據(jù)文件中讀取數(shù)據(jù),而是從查詢請求的查詢 條件中提取至少一個查詢項,然后根據(jù)第一數(shù)據(jù)文件的索引文件中存儲的已有查詢項和已 有查詢項對應的數(shù)據(jù)行指示信息,對至少一個查詢項中能夠被改寫的查詢項進行改寫,然 后根據(jù)至少一個查詢項中被改寫的查詢項和未被改寫的查詢項,在第一數(shù)據(jù)文件中進行查 詢,以獲得待查詢數(shù)據(jù)。
[0117] 上述數(shù)據(jù)行指示信息用于指示滿足已有查詢項的數(shù)據(jù)所在的數(shù)據(jù)行。對于以列為 單位進行存儲的列式存儲系統(tǒng)中,如果知道了待查詢數(shù)據(jù)所在的數(shù)據(jù)行,進一步加上其它 條件,可以將待查詢數(shù)據(jù)鎖定在較小的數(shù)據(jù)范圍內(nèi),甚至可以確定數(shù)據(jù)的精確位置(所在行 和所在列),這與讀取所有可能的數(shù)據(jù)相比,有利于減少IO操作,有利于提高查詢效率。 [0118]上述能夠被改寫的查詢項是指能夠利用索引文件中存儲的已有查詢項和已有查 詢項對應的數(shù)據(jù)行指示信息進行改寫的查詢項。而數(shù)據(jù)行指示信息指示出滿足已有查詢項 的數(shù)據(jù)所在的數(shù)據(jù)行,這意味著被改寫后的查詢項所對應的數(shù)據(jù)查詢范圍將極大縮小,有 利于減少IO操作,提高查詢效率。
[0119] 關于上述步驟202,其【具體實施方式】,與構建索引文件過程中的相應步驟相同,可 參見前述實施例中相應部分的描述,在此不再贅述。
[0120] 在一可選實施方式中,上述步驟203具體可采用以下實施方式實現(xiàn):
[0121] 對于至少一個查詢項中每個查詢項,可以將該查詢項在索引文件中進行匹配; [0122] 如果在索引文件中匹配到與該查詢項相同的已有查詢項,則根據(jù)所述匹配到的已 有查詢項對應的數(shù)據(jù)行指示信息對該查詢項進行改寫。例如,可以將該查詢項改寫為待查 詢項數(shù)據(jù)行等于所述匹配到的已有查詢項對應的數(shù)據(jù)行指示信息所指示的數(shù)據(jù)行。與改寫 前的查詢項相比,改寫后的查詢項直接給出待查詢數(shù)據(jù)所在的數(shù)據(jù)行,其能夠極大的減少 數(shù)據(jù)范圍。
[0123] 舉例說明,以上述表1所示第一數(shù)據(jù)文件為例,并結合上述表5所示索引文件,則假 設接收到查詢請求Q4:select count(*)as result from table where Cl contains'A' and C2>0,從Q4中提取查詢項"Cl contains'A'"和查詢項"C2>0",通過將兩個查詢項在表5 所示的索引文件中進行比較,發(fā)現(xiàn)表5中已經(jīng)存在這兩個查詢項,意味著這兩個查詢項可以 被改寫,于是根據(jù)表5所示索引文件中的已有查詢項及其對應的數(shù)據(jù)行指示信息對這兩個 查詢項進行改寫。例如,可以將查詢項"C2>0"改寫為行號(line) =0110001,將查詢項"C1 C〇ntains'A'"改寫為line = 1100100。這里直接使用數(shù)據(jù)行指示信息表示所指示的數(shù)據(jù)行, 但不限于此。與"C2>0"這一查詢條件相比,改寫后的查詢項明確限定了待查詢數(shù)據(jù)所在的 數(shù)據(jù)行,可以直接從第2、3和7行中讀取待查詢數(shù)據(jù),數(shù)據(jù)范圍較小,IO操作的次數(shù)相對較 少,查詢效率較高。
[0124] 在上述舉例的查詢請求中,不存在未被改寫的查詢項,則可以直接根據(jù)各被改寫 的查詢項在第一數(shù)據(jù)文件中進行查詢,以獲得待查詢數(shù)據(jù)。例如,可以將各被改寫的查詢項 按照原來的邏輯運算關系進行組合,以形成新的查詢條件,使用新的查詢條件到第一數(shù)據(jù) 文件中進行查詢。例如,將由查詢項"C2>0"改寫的Iine = Ol 10001與由查詢項"Cl contains 'A'"改寫的line = 1100100進行與運算,從而獲得新的查詢條件為line = 0100000,從而將 待查詢數(shù)據(jù)限定在第2行數(shù)據(jù)中。
[0125] 進一步,假設接收到查詢請求Q5: select......from table where C2>0and C2〈 = 5,從Q5中提取查詢項"C2>0"和查詢項"C2〈 = 5",通過將兩個查詢項在表5所示的索引文件 中進行比較,發(fā)現(xiàn)表5中已經(jīng)存在查詢項"C2>0",意味著查詢項"C2>0"屬于可改寫的查詢 項;而表5中不存在查詢項"C2〈 = 5",但是查詢項"C2〈 = 5"取反后得到的查詢項"C2>5"存在 于表5中,這意味著查詢項"C2〈 = 5"實際上也屬于可改寫的查詢項。
[0126] 在上述分析中發(fā)現(xiàn),在將查詢項在索引文件中進行匹配之前,可以判斷該查詢項 中的運算符是否屬于關系運算符;當該查詢項中的運算符屬于關系運算符時,進一步判斷 該查詢項中的運算符是否屬于預先規(guī)定的可以存儲到索引文件中的運算符;若判斷結果為 否,即該查詢項中的運算符不屬于預先規(guī)定的可以存儲到索引文件中的運算符,則可以先 對該查詢項進行取反操作,以獲得取反后的查詢項,然后將取反后的查詢項在索引文件中 進行匹配,以判斷該查詢項是否可以被改寫。
[0127] 在經(jīng)過上述匹配操作后,發(fā)現(xiàn)查詢項"C2>0"和查詢項"C2〈 = 5"都屬于可改寫的查 詢項,于是根據(jù)表5所示索引文件中的已有查詢項及其對應的數(shù)據(jù)行指示信息對這兩個查 詢項進行改寫。例如,可以將查詢項"C2>0"改寫為行號(line) =0110001,將查詢項"C2〈 = 5"改寫為line = 1111110。這里直接使用數(shù)據(jù)行指示信息表示所指示的數(shù)據(jù)行,但不限于 此。與"C2>0"這一查詢條件相比,改寫后的查詢項明確限定了待查詢數(shù)據(jù)所在的數(shù)據(jù)行,可 以直接從第2、3和7行中讀取待查詢數(shù)據(jù),數(shù)據(jù)范圍較小,IO操作的次數(shù)相對較少,查詢效率 較高。
[0128] 在上述舉例的查詢請求中,不存在未被改寫的查詢項,則可以直接根據(jù)各被改寫 的查詢項在第一數(shù)據(jù)文件中進行查詢,以獲得待查詢數(shù)據(jù)。例如,可以將各被改寫的查詢項 按照原來的邏輯運算