一種分布式數(shù)據(jù)庫sql執(zhí)行中inner join的智能評(píng)估方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及分布式數(shù)據(jù)庫數(shù)據(jù)存儲(chǔ)領(lǐng)域,尤其涉及一種分布式數(shù)據(jù)庫SQL執(zhí)行中INNER JOIN的智能評(píng)估方法。
【背景技術(shù)】
[0002]在當(dāng)今社會(huì),各個(gè)行業(yè)幾乎都會(huì)利用數(shù)據(jù)庫去存儲(chǔ)數(shù)據(jù),而隨著大數(shù)據(jù)與云計(jì)算時(shí)代的到來,這些行業(yè)數(shù)據(jù)存儲(chǔ)與計(jì)算的需求越發(fā)迫切,因此傳統(tǒng)的單機(jī)數(shù)據(jù)庫系統(tǒng)無法滿足用戶的需求,無法完成海量數(shù)據(jù)的計(jì)算與存儲(chǔ)。因此,分布式數(shù)據(jù)庫成為了業(yè)界的寵兒,隨著分布式技術(shù)、高速網(wǎng)絡(luò)傳輸技術(shù)以及并行計(jì)算技術(shù)的發(fā)展與成熟,分布式數(shù)據(jù)庫更是成為了數(shù)據(jù)庫行業(yè)的主流產(chǎn)品。
[0003]分布式數(shù)據(jù)庫一般都是采用多臺(tái)機(jī)器存儲(chǔ)數(shù)據(jù),即將用戶數(shù)據(jù)根據(jù)某種數(shù)據(jù)散布算法分布到數(shù)據(jù)庫的各個(gè)工作機(jī)器中,這樣來減少單臺(tái)數(shù)據(jù)庫工作機(jī)器所存儲(chǔ)的數(shù)據(jù)量,減少每一臺(tái)機(jī)器的存儲(chǔ)與計(jì)算壓力。因此,許多業(yè)界知名的公司都采用這種方式應(yīng)對(duì)海量數(shù)據(jù),例如Amazon的分布式存儲(chǔ)系統(tǒng)就是將數(shù)據(jù)分成許多數(shù)據(jù)塊,將數(shù)據(jù)塊分布到數(shù)據(jù)庫集群中的各個(gè)節(jié)點(diǎn)去存儲(chǔ)與計(jì)算。
[0004]分布式數(shù)據(jù)庫在執(zhí)行SQL時(shí),需要指定出符合分布式架構(gòu)的執(zhí)行計(jì)劃,將單機(jī)的執(zhí)行計(jì)劃擴(kuò)展到分布式的執(zhí)行計(jì)劃,以充分利用各個(gè)機(jī)器的資源,使SQL執(zhí)行的更加高效與快速。在指定分布式執(zhí)行計(jì)劃時(shí),需要保證SQL的執(zhí)行結(jié)果與在單機(jī)執(zhí)行的結(jié)果一致,即保證SQL執(zhí)行后數(shù)據(jù)結(jié)果集是正確的。
[0005]分布式數(shù)據(jù)庫執(zhí)行SQL時(shí),對(duì)于INNERJOIN的計(jì)劃需要仔細(xì)設(shè)計(jì),類似于矩陣乘法,不同的執(zhí)行順序有不同的執(zhí)行中間結(jié)果集,因此不同的執(zhí)行順序的執(zhí)行性能也是不同的,最優(yōu)執(zhí)行計(jì)劃與最差執(zhí)行計(jì)劃之間的執(zhí)行效率差別非常的大,甚至執(zhí)行時(shí)間有十倍以上的差距。因此,對(duì)于INNER JOIN的執(zhí)行計(jì)劃中需要較優(yōu)的執(zhí)行順序,以保證執(zhí)行的性能。業(yè)界數(shù)據(jù)庫中有很多使用貪心策略或是使用動(dòng)態(tài)規(guī)劃策略的產(chǎn)品,但是這些產(chǎn)品無法靈活的應(yīng)對(duì)多變的應(yīng)用環(huán)境。
【發(fā)明內(nèi)容】
[0006]為解決上述問題,本發(fā)明提供了一種分布式數(shù)據(jù)庫SQL執(zhí)行中INNERJOIN的智能評(píng)估方法,將人工指定評(píng)估方法與系統(tǒng)自動(dòng)選取與調(diào)節(jié)方式相結(jié)合,以確保評(píng)估算法本身執(zhí)行時(shí)間與INNER JOIN執(zhí)行時(shí)間的平衡,使系統(tǒng)執(zhí)行更靈活、更高效。
[0007]為實(shí)現(xiàn)上述目的,本發(fā)明采用的技術(shù)方案如下:
[0008]—種分布式數(shù)據(jù)庫SQL執(zhí)行中INNER JOIN的智能評(píng)估方法,包括以下步驟:
[0009]步驟1、數(shù)據(jù)庫系統(tǒng)接收到用戶下發(fā)的SQL,對(duì)SQL進(jìn)行解析;
[0010]步驟2、判斷解析的SQL中用戶是否指定了評(píng)估INNERJOIN的方法,若已指定,則順序執(zhí)行步驟3,若沒指定,則跳轉(zhuǎn)到步驟4;其中,評(píng)估INNER JOIN的方法包括貪心方法、動(dòng)態(tài)規(guī)劃方法和遺傳算法;
[0011]步驟3、按照用戶指定的方法執(zhí)行INNERJOIN的評(píng)估,評(píng)估完后跳轉(zhuǎn)到步驟5;若用戶指定采用遺傳算法評(píng)估INNER JOIN,用戶需指定遺傳算法迭代的次數(shù);
[0012]步驟4、按照系統(tǒng)默認(rèn)的方法執(zhí)行INNERJOIN的評(píng)估,具體步驟如下:
[0013]步驟4-1、按照動(dòng)態(tài)規(guī)劃的方法執(zhí)行INNERJOIN的評(píng)估;
[0014]步驟4-2、判斷動(dòng)態(tài)規(guī)劃方法是否執(zhí)行完畢,若已經(jīng)執(zhí)行完畢,則跳轉(zhuǎn)到步驟5,否則順序執(zhí)行步驟4-3;
[0015]步驟4-3、判斷動(dòng)態(tài)規(guī)劃方法的執(zhí)行時(shí)間是否超過了管理員預(yù)先設(shè)置的時(shí)間閾值,若超過了,則順序執(zhí)行步驟4-4,否則跳轉(zhuǎn)到步驟4-2;
[0016]步驟4-4、停止動(dòng)態(tài)規(guī)劃方法的執(zhí)行,改為執(zhí)行貪心方法進(jìn)行INNERJOIN執(zhí)行順序的評(píng)估;
[0017]步驟5、完成處理。
[0018]本發(fā)明采用了多種INNERJOIN的評(píng)估方法,包括時(shí)間復(fù)雜度為0(n)的貪心方法、時(shí)間復(fù)雜度為0(m*n)的動(dòng)態(tài)規(guī)劃方法以及時(shí)間復(fù)雜度與迭代次數(shù)相關(guān)的遺傳算法3種。這3種評(píng)估方法各有不同的特點(diǎn),其中,貪心方法能夠以較短的評(píng)估時(shí)間完成評(píng)估,但是貪心方法很難保證最優(yōu)的評(píng)估結(jié)果;相反的,動(dòng)態(tài)規(guī)劃方法的評(píng)估時(shí)間可能會(huì)很長,但是其評(píng)估的結(jié)果可以保證是最優(yōu)的;而對(duì)于遺傳算法,其評(píng)估的時(shí)間和評(píng)估的結(jié)果是由迭代的次數(shù)決定的,迭代的次數(shù)越長,評(píng)估的時(shí)間就越久,而評(píng)估的結(jié)果越好。這3種評(píng)估方法都可以產(chǎn)生較優(yōu)的INNER JOIN的執(zhí)行順序,可以適用各種數(shù)據(jù)庫應(yīng)用場景,滿足用戶的各種需求,即可以保證在評(píng)估算法本身與評(píng)估算法產(chǎn)生的評(píng)估結(jié)果之間達(dá)到一個(gè)平衡,不會(huì)產(chǎn)生很差的評(píng)估結(jié)果,也不會(huì)造成評(píng)估算法本身運(yùn)行時(shí)間過長的問題。
[0019]本發(fā)明可以由用戶根據(jù)所需執(zhí)行SQL的特性人工指定或者交由數(shù)據(jù)庫系統(tǒng)自適應(yīng)評(píng)估兩種方法去評(píng)估INNER JOIN的執(zhí)行順序。人工指定方式較為靈活,可以指定貪心方法、動(dòng)態(tài)規(guī)劃方法、遺傳算法這三種方法中的一種去評(píng)估當(dāng)前執(zhí)行的SQL的INNER JOIN順序。若需要做INNER JOIN的表的個(gè)數(shù)較少,則用動(dòng)態(tài)規(guī)劃的方法和遺傳算法都可以得到很好的評(píng)估結(jié)果。若需要做INNER JOIN的表的個(gè)數(shù)較多,則可以采用貪心方法去執(zhí)行,以免評(píng)估的時(shí)間過長,影響整體的系統(tǒng)效率。
[0020]若用戶不指定執(zhí)行SQL的INNERJOIN所采用的評(píng)估方法,系統(tǒng)會(huì)自動(dòng)選取一種評(píng)估方法。一般是先按照動(dòng)態(tài)規(guī)劃方法評(píng)估INNER JOIN,因?yàn)閯?dòng)態(tài)規(guī)劃方法能夠保證評(píng)估的結(jié)果是最優(yōu)解,但是動(dòng)態(tài)規(guī)劃方法解決本問題的時(shí)間復(fù)雜度為0(m*n),即面對(duì)著很多表做INNER JOIN的SQL,動(dòng)態(tài)規(guī)劃方法本身所運(yùn)行的時(shí)間非常的長,甚至是不可以接受的。因此,當(dāng)動(dòng)態(tài)規(guī)劃方法執(zhí)行的時(shí)間超過了管理員預(yù)先設(shè)置的INNER JOIN評(píng)估的時(shí)間閾值時(shí),系統(tǒng)會(huì)放棄動(dòng)態(tài)規(guī)劃方法,采用時(shí)間復(fù)雜度為0(n)的貪心方法去評(píng)估,可以在很短的時(shí)間內(nèi)評(píng)估出結(jié)果,但是該結(jié)果不保證最優(yōu)解。
[0021]由動(dòng)態(tài)規(guī)劃方法轉(zhuǎn)換為貪心方法的時(shí)間閾值由管理員在啟動(dòng)數(shù)據(jù)庫的時(shí)候進(jìn)行配置,但是管理員可以動(dòng)態(tài)地及時(shí)調(diào)整該閾值,以便適應(yīng)不同的應(yīng)用需求。
[0022]步驟3中用戶以Hint的方式或者以用戶會(huì)話參數(shù)的方式指定INNERJOIN的評(píng)估方法。這種方式適合于經(jīng)驗(yàn)豐富的用戶或?qū)π阅苡刑厥庑枨蟮挠脩?,用戶通過這種方式選取自己想要的評(píng)估方法。數(shù)據(jù)庫系統(tǒng)充分相信用戶的參數(shù)設(shè)置,不會(huì)對(duì)用戶的選擇做任何干預(yù)。
[0023]步驟3的具體步驟如下:
[0024]步驟3-1、數(shù)據(jù)庫系統(tǒng)接收用戶設(shè)定的執(zhí)行方法和參數(shù),準(zhǔn)備對(duì)SQL進(jìn)行INNERJOIN評(píng)估;
[0025]步驟3-2、判斷用戶是否指定了用遺傳算法執(zhí)行SQL的INNERJOIN評(píng)估,若指定了,則跳轉(zhuǎn)到步驟3-4,否則順序執(zhí)行步驟3-3;
[0026]步驟3-3、按照用戶指定的其他評(píng)估方法執(zhí)行評(píng)估,評(píng)估完跳轉(zhuǎn)到步驟3-7;
[0027]步驟3-4、判斷用戶是否指定了用遺傳算法執(zhí)行INNERJOIN評(píng)估時(shí)的迭代次數(shù),若指定了,則跳轉(zhuǎn)到步驟3-6,否則順序執(zhí)行步驟3-5;
[0028]步驟3-5、按照系統(tǒng)默認(rèn)迭代次數(shù),即數(shù)據(jù)庫管理員預(yù)先配置的迭代次數(shù),執(zhí)行遺傳算法,執(zhí)行完跳轉(zhuǎn)到步驟3-7;
[0029]步驟3-6、按照用戶指定的迭代次數(shù)執(zhí)行遺傳算法;
[0030]步驟3-7、完成處理。
[0031]遺傳算法的迭代次數(shù)對(duì)遺傳算法的結(jié)果影響非常大,同樣的,遺傳算法迭代的次數(shù)越多,執(zhí)行算法本身所耗費(fèi)的時(shí)間就越長。用戶指定采用遺傳算法的方式評(píng)估INNERJOIN的執(zhí)行順序,需要指定下算法的迭代次數(shù),由用戶去掌控INNER JOIN的評(píng)估時(shí)間。若用戶不指定迭代次數(shù)則系統(tǒng)會(huì)采用數(shù)據(jù)庫管理員預(yù)先配置好的默認(rèn)迭代次數(shù)去執(zhí)行。
[0032]步驟4-3