一種查詢語句的優(yōu)化方法和裝置的制造方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及數(shù)據(jù)查詢技術(shù)領(lǐng)域,尤其涉及一種查詢語句的優(yōu)化方法和裝置。
【背景技術(shù)】
[0002] 目前,大數(shù)據(jù)查詢系統(tǒng)(例如:Hive,Shark, Impala等)解析查詢語句和優(yōu)化查詢 語句的基本單位為單個(gè)查詢語句。大數(shù)據(jù)查詢系統(tǒng)解析查詢語句的過程一般包括:大數(shù)據(jù) 查詢系統(tǒng)將查詢語句生成邏輯查詢樹(也稱為邏輯查詢計(jì)劃),將邏輯查詢樹生成該大數(shù) 據(jù)查詢系統(tǒng)中的查詢執(zhí)行引擎(例如,MapReduce、Spark等)可識(shí)別的物理查詢樹(也稱 為物理查詢計(jì)劃);該查詢執(zhí)行引擎執(zhí)行物理查詢樹中的物理任務(wù),生成查詢結(jié)果;其中, 邏輯查詢樹由多個(gè)操作符構(gòu)成。
[0003] 為了提高查詢效率,一種查詢語句的優(yōu)化方法包括:大數(shù)據(jù)查詢系統(tǒng)通過比較當(dāng) 前查詢語句對(duì)應(yīng)的邏輯查詢樹中的操作符與緩存的歷史邏輯查詢樹中的操作符,確定出當(dāng) 前查詢語句對(duì)應(yīng)的邏輯查詢樹與歷史邏輯查詢樹中可復(fù)用查詢結(jié)果的目標(biāo)操作符;將歷史 邏輯查詢樹中的目標(biāo)操作符對(duì)應(yīng)的查詢結(jié)果作為當(dāng)前查詢語句中的目標(biāo)操作符對(duì)應(yīng)的查 詢結(jié)果。另外,該方法還可以包括:緩存當(dāng)前查詢語句對(duì)應(yīng)的邏輯查詢樹及其對(duì)應(yīng)的查詢結(jié) 果,以供大數(shù)據(jù)查詢系統(tǒng)在對(duì)下一個(gè)查詢語句進(jìn)行優(yōu)化的過程中使用。
[0004] 上述查詢語句的優(yōu)化方法通過復(fù)用歷史邏輯查詢樹對(duì)應(yīng)的查詢結(jié)果來提高查詢 效率,這樣,當(dāng)查詢語句的數(shù)量較多時(shí),需要占用大量的存儲(chǔ)空間來緩存歷史邏輯查詢樹及 其對(duì)應(yīng)的查詢結(jié)果。
【發(fā)明內(nèi)容】
[0005] 本發(fā)明實(shí)施例提供一種查詢語句的優(yōu)化方法和裝置,用以解決由于需要緩存歷史 邏輯查詢樹及其對(duì)應(yīng)的查詢結(jié)果而導(dǎo)致的占用大量的存儲(chǔ)空間的問題。
[0006] 為達(dá)到上述目的,本發(fā)明的實(shí)施例采用如下技術(shù)方案:
[0007] 第一方面,提供一種查詢語句的優(yōu)化方法,包括:
[0008] 接收η個(gè)查詢語句;其中,η彡2, η為整數(shù);
[0009] 將所述η個(gè)查詢語句生成η個(gè)邏輯查詢樹;
[0010] 根據(jù)預(yù)設(shè)規(guī)則為所述η個(gè)邏輯查詢樹中的操作符對(duì)應(yīng)的操作數(shù)添加版本號(hào);其 中,所述預(yù)設(shè)規(guī)則包括:不同操作數(shù)的版本號(hào)不同,操作符每次所定值的操作數(shù)的版本號(hào)不 同,不同操作符組中的操作符對(duì)應(yīng)的同一操作數(shù)的版本號(hào)不同;所述操作符組是指以對(duì)所 述同一操作數(shù)進(jìn)行定值的操作符為界限對(duì)所述η個(gè)邏輯查詢樹中的操作符進(jìn)行分組后得 到的一個(gè)分組;
[0011] 對(duì)所對(duì)應(yīng)的操作數(shù)的版本號(hào)相同、且所屬不同邏輯查詢樹的操作符進(jìn)行優(yōu)化,以 減少所述η個(gè)邏輯查詢樹生成的物理任務(wù)的數(shù)量。
[0012] 結(jié)合第一方面,在第一種可能的實(shí)現(xiàn)方式中,所述根據(jù)預(yù)設(shè)規(guī)則為所述η個(gè)邏輯 查詢樹中的操作符對(duì)應(yīng)的操作數(shù)添加版本號(hào),包括:
[0013] 為所述η個(gè)邏輯查詢樹中的操作符每次所定值的操作數(shù)添加唯一的版本號(hào);
[0014] 為目標(biāo)操作符組中的操作符對(duì)應(yīng)的目標(biāo)操作數(shù)添加目標(biāo)版本號(hào);其中,所述目標(biāo) 操作符組中的首個(gè)操作符為對(duì)操作數(shù)進(jìn)行定值的操作符,所述目標(biāo)操作數(shù)為所述目標(biāo)操作 符組中的首個(gè)操作符所定值的操作數(shù);所述目標(biāo)版本號(hào)與該目標(biāo)操作符組中的首個(gè)操作符 所定值的操作數(shù)的版本號(hào)相同;
[0015] 為尚未擁有版本號(hào)的同一操作數(shù)添加唯一的版本號(hào)。
[0016] 結(jié)合第一方面或第一方面的第一種可能的實(shí)現(xiàn)方式,在第二種可能的實(shí)現(xiàn)方式 中,所述對(duì)所對(duì)應(yīng)的操作數(shù)的版本號(hào)相同、且所屬不同邏輯查詢樹的操作符進(jìn)行優(yōu)化,包 括:
[0017] 將所對(duì)應(yīng)的操作數(shù)的版本號(hào)相同、具有定值-引用關(guān)聯(lián)關(guān)系、且所屬不同邏輯查 詢樹的兩個(gè)操作符中的對(duì)操作數(shù)進(jìn)行定值的操作符與對(duì)操作數(shù)進(jìn)行引用的操作符的后繼 之間建立前驅(qū)后繼關(guān)系,并刪除對(duì)操作數(shù)進(jìn)行引用的操作符。
[0018] 結(jié)合第一方面、第一方面的第一種可能的實(shí)現(xiàn)方式至第二種可能的實(shí)現(xiàn)方式任一 種,在第三種可能的實(shí)現(xiàn)方式中,所述對(duì)所對(duì)應(yīng)的操作數(shù)的版本號(hào)相同、且所屬不同邏輯查 詢樹的操作符進(jìn)行優(yōu)化,包括:
[0019] 為所對(duì)應(yīng)的操作數(shù)的版本號(hào)相同、操作類型相同、且所屬不同邏輯查詢樹的兩個(gè) 操作符添加合并分離標(biāo)簽;其中,所述合并分離標(biāo)簽用于使該兩個(gè)操作符生成同一物理任 務(wù),并在執(zhí)行該物理任務(wù)之后生成兩個(gè)查詢結(jié)果。
[0020] 結(jié)合第一方面、第一方面的第一種可能的實(shí)現(xiàn)方式至第三種可能的實(shí)現(xiàn)方式任一 種,在第四種可能的實(shí)現(xiàn)方式中,所述對(duì)所對(duì)應(yīng)的操作數(shù)的版本號(hào)相同、且所屬不同邏輯查 詢樹的操作符進(jìn)行優(yōu)化,包括:
[0021] 通過共有的子樹將兩個(gè)邏輯查詢樹合并為一個(gè)邏輯查詢樹;其中,所述共有的子 樹中相應(yīng)的操作符對(duì)應(yīng)的版本號(hào)相同,所述共有的子樹包含具有后繼不具有前驅(qū)的操作 符。
[0022] 結(jié)合第一方面、第一方面的第一種可能的實(shí)現(xiàn)方式至第四種可能的實(shí)現(xiàn)方式任一 種,在第五種可能的實(shí)現(xiàn)方式中,在所述對(duì)所對(duì)應(yīng)的操作數(shù)的版本號(hào)相同、且所屬不同邏輯 查詢樹的操作符進(jìn)行優(yōu)化之后,所述方法還包括:
[0023] 確定具有定值-引用關(guān)聯(lián)關(guān)系或定值-定值關(guān)聯(lián)關(guān)系的兩個(gè)操作符;
[0024] 在該兩個(gè)操作符中的前一個(gè)操作符對(duì)應(yīng)的物理任務(wù)與后一個(gè)操作符對(duì)應(yīng)的物理 任務(wù)之間添加有向邊,以使得該前一個(gè)操作符對(duì)應(yīng)的物理任務(wù)在該后一個(gè)操作符對(duì)應(yīng)的物 理任務(wù)之前輸出。
[0025] 結(jié)合第一方面、第一方面的第一種可能的實(shí)現(xiàn)方式至第五種可能的實(shí)現(xiàn)方式任一 種,在第六種可能的實(shí)現(xiàn)方式中,在所述根據(jù)預(yù)設(shè)規(guī)則為所述η個(gè)邏輯查詢樹中的操作符 對(duì)應(yīng)的操作數(shù)添加版本號(hào)之后,所述方法還包括:
[0026] 為所述η個(gè)邏輯查詢樹中的、且出現(xiàn)次數(shù)大于或等于一閾值的版本號(hào)對(duì)應(yīng)的操作 符添加熱數(shù)據(jù)標(biāo)簽;其中,相同熱數(shù)據(jù)標(biāo)簽對(duì)應(yīng)同一版本號(hào);
[0027] 將添加有相同熱數(shù)據(jù)標(biāo)簽的、且不具有有向邊的操作符生成的物理任務(wù)并行輸 出。
[0028] 結(jié)合第一方面、第一方面的第一種可能的實(shí)現(xiàn)方式至第六種可能的實(shí)現(xiàn)方式任一 種,在第七種可能的實(shí)現(xiàn)方式中,在所述根據(jù)預(yù)設(shè)規(guī)則為所述η個(gè)邏輯查詢樹中的操作符 對(duì)應(yīng)的操作數(shù)添加版本號(hào)之后,所述方法還包括:
[0029] 將所述η個(gè)邏輯查詢樹中的、且具有定值-引用關(guān)聯(lián)關(guān)系的操作符所屬的邏輯查 詢樹歸為第一類分組,將其他邏輯查詢樹歸為第二類分組;
[0030] 確定所述第一類分組的第一類優(yōu)化方式和所述第二類分組的第二類優(yōu)化方式;
[0031] 所述對(duì)所對(duì)應(yīng)的操作數(shù)的版本號(hào)相同、且所屬不同邏輯查詢樹的操作符進(jìn)行優(yōu) 化,包括:
[0032] 按照所述第一類優(yōu)化方式對(duì)所述第一類分組中的所對(duì)應(yīng)的操作數(shù)的版本號(hào)相同、 且所屬不同邏輯查詢樹的操作符進(jìn)行優(yōu)化;
[0033] 按照所述第二類優(yōu)化方式對(duì)所述第二類分組中的所對(duì)應(yīng)的操作數(shù)的版本號(hào)相同、 且所屬不同邏輯查詢樹的操作符進(jìn)行優(yōu)化。
[0034] 結(jié)合第一方面的第七種可能的實(shí)現(xiàn)方式,在第八種可能的實(shí)現(xiàn)方式中,在所述將 所述η個(gè)邏輯查詢樹中的、且具有定值-引用關(guān)聯(lián)關(guān)系的操作符所屬的邏輯查詢樹歸為第 一類分組之后,所述方法還包括:
[0035] 將所述第一類分組中的、所對(duì)應(yīng)的操作數(shù)的版本號(hào)相同的、且具有定值-引用關(guān) 聯(lián)關(guān)系的操作符所屬的邏輯查詢樹歸為一個(gè)子分組;
[0036] 所述按照所述第一類優(yōu)化方式對(duì)所述第一類分組中的所對(duì)應(yīng)的操作數(shù)的版本號(hào) 相同、且所屬不同邏輯查詢樹的操作符進(jìn)行優(yōu)化,包括:
[0037] 按照所述第一類優(yōu)化方式分別對(duì)所述第一類分組中的子分組中的所對(duì)應(yīng)的操作 數(shù)的版本號(hào)相同、且所屬不同邏輯查詢樹的操作符進(jìn)行優(yōu)化。
[0038] 結(jié)合第一方面的第七種可能的實(shí)現(xiàn)方式或第八種可能的實(shí)現(xiàn)方式,在第九種可能 的實(shí)現(xiàn)方式中,在所述將其他邏輯查詢樹歸為第二類分組之后,所述方法還包括:
[0039] 根據(jù)邏輯查詢樹間的所對(duì)應(yīng)的操作數(shù)的版本號(hào)的重復(fù)程度將所述第二類分組中 的邏輯查詢樹分為多個(gè)子分組;
[0040] 所述按照所述第二類優(yōu)化方式對(duì)所述第二類分組中的所對(duì)應(yīng)的操作數(shù)的版本號(hào) 相同、且所屬不同邏輯查詢樹的操作符進(jìn)行優(yōu)化,包括:
[0041] 按照所述第二類優(yōu)化方式分別對(duì)所述第二類分組中的子分組中的所對(duì)應(yīng)的操作 數(shù)的版本號(hào)相同、且所屬不同邏輯查詢樹的操作符進(jìn)行優(yōu)化。
[0042] 結(jié)合第一方面、第一方面的第一種可能的實(shí)現(xiàn)方式至第九種可能的實(shí)現(xiàn)方式任一 種,在第十種可能的實(shí)現(xiàn)方式中,在所述對(duì)所對(duì)應(yīng)的操作數(shù)的版本號(hào)相同、且所屬不同邏輯 查詢樹的操作符進(jìn)行優(yōu)化之后,所述方法還包括:
[0043] 為對(duì)所述η個(gè)邏輯查詢樹進(jìn)行優(yōu)化后生成的m個(gè)邏輯查詢樹添加虛擬根節(jié)點(diǎn),以 形成總邏輯查詢樹;其中,η彡m彡1,m為整數(shù);
[0044] 按照查詢語句內(nèi)的優(yōu)化方法對(duì)所述總邏輯查詢樹中的操作符進(jìn)行優(yōu)化。
[0045] 第二方面,提供一種查詢語句的優(yōu)化裝置,包括:
[0046] 接收單元,用于接收η個(gè)查詢語句;其中,η彡2, η為整數(shù);
[0047] 生成單元,用于將所述η個(gè)查詢語句生成η個(gè)邏輯查詢樹;
[0048] 執(zhí)行單元,用于根據(jù)預(yù)設(shè)規(guī)則為所述η個(gè)邏輯查詢樹中的操作符對(duì)應(yīng)的操作數(shù)添 加版本號(hào);其中,所述預(yù)設(shè)規(guī)則包括:不同操作數(shù)的版本號(hào)不同,操作符每次所定值的操作 數(shù)的版本號(hào)不同,不同操作符組中的操作符對(duì)應(yīng)的同一操作數(shù)的版本號(hào)不同;所述操作符 組是指以對(duì)所述同一操作數(shù)進(jìn)行定值的操作符為界限對(duì)所述η個(gè)邏輯查詢樹中的操作符 進(jìn)行分組后得到的一個(gè)分組;
[0049] 優(yōu)化單元,用于對(duì)所對(duì)應(yīng)的操作數(shù)的版本號(hào)相同、且所屬不同邏輯查詢樹的操作 符進(jìn)行優(yōu)化,以減少所述η個(gè)邏輯查詢樹生成的物理任務(wù)的數(shù)量。
[0050] 結(jié)合第二方面,在第一種可能的實(shí)現(xiàn)方式中,所述執(zhí)行單元具體用于:
[0051] 為所述η個(gè)邏輯查詢樹中的操作符每次所定值的操作數(shù)添加唯一的版本號(hào);
[0052] 為目標(biāo)操作符組中的操作符對(duì)應(yīng)的目標(biāo)操作數(shù)添加目標(biāo)版本號(hào);其中,所述目標(biāo) 操作符組中的首個(gè)操作符為對(duì)操作數(shù)進(jìn)行定值的操作符,所述目標(biāo)操作數(shù)為所述目標(biāo)操作 符組中的首個(gè)操作符所定值的操作數(shù);所述目標(biāo)版本號(hào)與該目標(biāo)操作符組中的首個(gè)操作符 所定值的操作數(shù)的版本號(hào)相同;
[0053] 為尚未擁有版本號(hào)的同一操作數(shù)添加唯一的版本號(hào)。
[0054] 結(jié)合第二方面或第二方面的第一種可能的實(shí)現(xiàn)方式,在第二種可能的實(shí)現(xiàn)方式 中,所述優(yōu)化單元具體用于:
[0055] 將所對(duì)應(yīng)的操作數(shù)的版本號(hào)相同、具有定值-引用關(guān)聯(lián)關(guān)系、且所屬不同邏輯查 詢樹的兩個(gè)操作符中的對(duì)操作數(shù)進(jìn)行定值的操作符與對(duì)操作數(shù)進(jìn)行引用的操作符的后繼 之間建立前驅(qū)后繼關(guān)系,并刪除對(duì)操作數(shù)進(jìn)行引用的操作符。
[0056] 結(jié)合第二方面、第二方面的第一種可能的實(shí)現(xiàn)方式至第二種可能的實(shí)現(xiàn)方式任一 種,在第三種可能的實(shí)現(xiàn)方式中,所述優(yōu)化單元還用于:
[0057] 為所對(duì)應(yīng)的操作數(shù)的版本號(hào)相同、操作類型相同、且所屬不同邏輯查詢樹的兩個(gè) 操作符添加合并分離標(biāo)簽;其中,所述合并分離標(biāo)簽用于使該兩個(gè)操作符生成同一物理任 務(wù),并在執(zhí)行該物理任務(wù)之后生成兩個(gè)查詢結(jié)果。
[0058] 結(jié)合第二方面、第二方面的第一種可能的實(shí)現(xiàn)方式至第三種可能的實(shí)現(xiàn)方式任一 種,在第四種可能的實(shí)現(xiàn)方式中,所述優(yōu)化單元還用于:
[0059] 通過共有的子樹將兩個(gè)邏輯查詢樹合并為一個(gè)邏輯查詢樹;其中,所述共有的子 樹中相應(yīng)的操作符對(duì)應(yīng)的版本號(hào)相同,所述共有的子樹包含具有后繼不具有前驅(qū)的操作 符。
[0060] 結(jié)合第二方面、第二方面的第一種可能的實(shí)現(xiàn)方式至第四種可能的實(shí)現(xiàn)方式任一 種,在第五種可能的實(shí)現(xiàn)方式中,所述查詢語句的優(yōu)化裝置還包括:
[0061] 確定單元,用于確定具有定值-引用關(guān)聯(lián)關(guān)系或定值-定值關(guān)聯(lián)關(guān)系的兩個(gè)操作 符;
[0062] 所述執(zhí)行單元還用于,在該兩個(gè)操作符中的前一個(gè)操作符對(duì)應(yīng)的物理