本發(fā)明涉及分布式數(shù)據(jù)庫,具體涉及一種分布式數(shù)據(jù)庫中分布鍵的確定方法、裝置及電子設(shè)備。
背景技術(shù):
1、分布式數(shù)據(jù)庫中,數(shù)據(jù)庫表的分布鍵設(shè)置尤為關(guān)鍵,如果設(shè)置不好,會導(dǎo)致業(yè)務(wù)語句執(zhí)行時(shí)數(shù)據(jù)節(jié)點(diǎn)之間頻繁交換數(shù)據(jù),導(dǎo)致系統(tǒng)網(wǎng)絡(luò)負(fù)荷增加,同時(shí)數(shù)據(jù)庫性能下降。其中,業(yè)務(wù)語句可以理解以結(jié)構(gòu)化查詢語言(structured?query?language,sql)編寫的業(yè)務(wù)sql。
2、目前,從每張數(shù)據(jù)庫表中確定最優(yōu)分布鍵的方案都是依賴數(shù)據(jù)庫實(shí)現(xiàn)的。例如,首先搭建數(shù)據(jù)庫集群,然后將待分析的業(yè)務(wù)sql輸入給數(shù)據(jù)庫執(zhí)行,單個(gè)業(yè)務(wù)sql執(zhí)行結(jié)束后執(zhí)行下一個(gè)業(yè)務(wù)sql,直到所有業(yè)務(wù)執(zhí)行完畢。在執(zhí)行每個(gè)業(yè)務(wù)sql時(shí),通過插件方式將業(yè)務(wù)sql的分析操作注入到sql執(zhí)行過程,由此,每個(gè)業(yè)務(wù)sql執(zhí)行完畢后,也同步完成了分布鍵信息的收集。執(zhí)行并收集所有業(yè)務(wù)sql后,對收集的分布鍵信息進(jìn)行計(jì)算,得出最優(yōu)分布鍵。
3、然而,上述分布鍵確定方案存在部署繁瑣、操作復(fù)雜、效率低的問題。一方面,該方案需要部署一套數(shù)據(jù)庫系統(tǒng),這增大了信息收集的前置工作難度。另一方面,由于數(shù)據(jù)庫系統(tǒng)本身有自己的內(nèi)在處理邏輯,因此,對于執(zhí)行的業(yè)務(wù)sql需要是全套完整的sql,包括數(shù)據(jù)庫表的建表sql、查詢sql、更新sql等。例如,對一張數(shù)據(jù)庫表進(jìn)行查詢時(shí),該表首先必須存在,也即需要先執(zhí)行建表sql,否則查詢就會報(bào)錯(cuò),進(jìn)而導(dǎo)致分布鍵分析無法進(jìn)行。對于分布鍵分析的過程,全套sql中的查詢sql是有意義的,通過統(tǒng)計(jì)查詢sql中表連接字段的出現(xiàn)次數(shù)和位置,可以知道哪個(gè)字段作為分布鍵更合理。但全套sql中的建表sql對于分布鍵分析是沒有意義的,然而,分布鍵確定方案又依賴于數(shù)據(jù)庫環(huán)境運(yùn)行sql、分析sql,為了保證數(shù)據(jù)庫的邏輯運(yùn)行,建表sql又無法避免,這導(dǎo)致了整個(gè)過程無效工作量的增大。
4、此外,由于上述分布鍵確定方案中的每個(gè)業(yè)務(wù)sql的分析都依賴于數(shù)據(jù)庫環(huán)境,因此,每個(gè)業(yè)務(wù)sql分析都需要經(jīng)過解析器、語義分析、重寫、分布鍵分析、優(yōu)化器、執(zhí)行器等模塊。然而,優(yōu)化器和執(zhí)行器工作對于信息收集階段而言不是必須的,這兩步也是最耗時(shí)的,占到了整個(gè)sql處理的大部分時(shí)間,進(jìn)而導(dǎo)致了單個(gè)sql的處理效率不高。
5、綜上,目前的分布鍵確定方案對數(shù)據(jù)庫環(huán)境具有較強(qiáng)的依賴關(guān)系,且存在部署繁瑣、操作復(fù)雜、效率低的問題。
技術(shù)實(shí)現(xiàn)思路
1、鑒于上述問題,本發(fā)明提供了一種分布式數(shù)據(jù)庫中分布鍵的確定方法。
2、根據(jù)本發(fā)明的第一個(gè)方面,提供了一種分布式數(shù)據(jù)庫中分布鍵的確定方法,包括:從開發(fā)分布式數(shù)據(jù)庫時(shí)編寫的編碼文件中解析出多個(gè)初始結(jié)構(gòu)化查詢語句;在不執(zhí)行多個(gè)初始結(jié)構(gòu)化查詢語句的情況下,從多個(gè)初始結(jié)構(gòu)化查詢語句中篩選出屬于預(yù)設(shè)語句類型的多個(gè)結(jié)構(gòu)化查詢語句;根據(jù)每個(gè)結(jié)構(gòu)化查詢語句的查詢樹,確定與每個(gè)結(jié)構(gòu)化查詢語句相關(guān)的多個(gè)候選鍵各自的重分布代價(jià),其中,結(jié)構(gòu)化查詢語句包括至少一個(gè)數(shù)據(jù)庫表,每個(gè)數(shù)據(jù)庫表包括至少一個(gè)候選鍵;重分布代價(jià)至少是基于候選鍵在結(jié)構(gòu)化查詢語句中的出現(xiàn)次數(shù)確定的;將多個(gè)結(jié)構(gòu)化查詢語句中相同數(shù)據(jù)庫表的相同候選鍵的重分布代價(jià)進(jìn)行匯總,得到每個(gè)數(shù)據(jù)庫表中每個(gè)候選鍵的重分布總代價(jià);以及將每個(gè)數(shù)據(jù)庫表中重分布總代價(jià)最高的候選鍵作為數(shù)據(jù)庫表的分布鍵。
3、根據(jù)本發(fā)明的實(shí)施例,根據(jù)與每個(gè)結(jié)構(gòu)化查詢語句的查詢樹,確定與每個(gè)結(jié)構(gòu)化查詢語句相關(guān)的多個(gè)候選鍵各自的重分布代價(jià),包括:針對每個(gè)結(jié)構(gòu)化查詢語句,將每個(gè)候選鍵在查詢樹中的出現(xiàn)次數(shù),作為每個(gè)候選鍵的重分布代價(jià);或者針對每個(gè)結(jié)構(gòu)化查詢語句,根據(jù)每個(gè)候選鍵在查詢樹中的位置和出現(xiàn)次數(shù),確定每個(gè)候選鍵的重分布代價(jià)。
4、根據(jù)本發(fā)明的實(shí)施例,根據(jù)每個(gè)候選鍵在查詢樹中的位置和出現(xiàn)次數(shù),確定每個(gè)候選鍵的重分布代價(jià),包括:根據(jù)每個(gè)候選鍵在查詢樹中的位置,確定與位置對應(yīng)的位置權(quán)重;以及根據(jù)位置權(quán)重和出現(xiàn)次數(shù),確定每個(gè)候選鍵的重分布代價(jià)。
5、根據(jù)本發(fā)明的實(shí)施例,該方法還包括:針對每個(gè)結(jié)構(gòu)化查詢語句,將每個(gè)數(shù)據(jù)庫表中每個(gè)候選鍵的重分布代價(jià)緩存至哈希表;其中,哈希表包括多個(gè)緩存記錄,每個(gè)緩存記錄與一個(gè)數(shù)據(jù)庫表中的一個(gè)候選鍵相關(guān),緩存記錄的緩存結(jié)構(gòu)包括命名空間、數(shù)據(jù)庫表名、候選鍵的屬性名和重分布代價(jià)。
6、根據(jù)本發(fā)明的實(shí)施例,將多個(gè)結(jié)構(gòu)化查詢語句中相同數(shù)據(jù)庫表的相同候選鍵的重分布代價(jià)進(jìn)行匯總,得到每個(gè)數(shù)據(jù)庫表中每個(gè)候選鍵的重分布總代價(jià),包括:遍歷哈希表,將多個(gè)結(jié)構(gòu)化查詢語句中相同數(shù)據(jù)庫表的相同候選鍵的重分布代價(jià)進(jìn)行匯總,得到每個(gè)數(shù)據(jù)庫表中每個(gè)候選鍵的重分布總代價(jià)。
7、根據(jù)本發(fā)明的實(shí)施例,初始結(jié)構(gòu)化查詢語句的語句類型包括操作類型和定義類型;在不執(zhí)行多個(gè)初始結(jié)構(gòu)化查詢語句的情況下,從多個(gè)初始結(jié)構(gòu)化查詢語句中,確定預(yù)設(shè)語句類型的多個(gè)結(jié)構(gòu)化查詢語句,包括:在不執(zhí)行多個(gè)初始結(jié)構(gòu)化查詢語句的情況下,從多個(gè)初始結(jié)構(gòu)化查詢語句中篩選出操作類型的初始結(jié)構(gòu)化語句,并將操作類型的初始結(jié)構(gòu)化語句確定為結(jié)構(gòu)化查詢語句。
8、根據(jù)本發(fā)明的實(shí)施例,該方法還包括:通過解析器、語義分析、重寫操作,生成多個(gè)結(jié)構(gòu)化查詢語句中每個(gè)結(jié)構(gòu)化查詢語句的查詢樹;通過解析器、語義分析、重寫操作生成多個(gè)結(jié)構(gòu)化查詢語句中每個(gè)結(jié)構(gòu)化查詢語句的查詢樹,包括:通過解析器對結(jié)構(gòu)化查詢語句進(jìn)行解析,得到語法樹;對語法樹進(jìn)行語義分析并通過重寫操作生成查詢樹。
9、本發(fā)明的第二方面提供了一種分布式數(shù)據(jù)庫中分布鍵的確定裝置,其特征在于,裝置包括:讀取模塊,用于從開發(fā)分布式數(shù)據(jù)庫時(shí)編寫的編碼文件中解析出多個(gè)初始結(jié)構(gòu)化查詢語句;確定模塊,用于在不執(zhí)行多個(gè)初始結(jié)構(gòu)化查詢語句的情況下,從多個(gè)初始結(jié)構(gòu)化查詢語句中篩選出屬于預(yù)設(shè)語句類型的多個(gè)結(jié)構(gòu)化查詢語句;代價(jià)計(jì)算模塊,用于根據(jù)每個(gè)結(jié)構(gòu)化查詢語句的查詢樹,確定與每個(gè)結(jié)構(gòu)化查詢語句相關(guān)的多個(gè)候選鍵各自的重分布代價(jià),其中,結(jié)構(gòu)化查詢語句包括至少一個(gè)數(shù)據(jù)庫表,每個(gè)數(shù)據(jù)庫表包括至少一個(gè)候選鍵,重分布代價(jià)至少是基于候選鍵在結(jié)構(gòu)化查詢語句中的出現(xiàn)次數(shù)確定的;匯總模塊,用于將多個(gè)結(jié)構(gòu)化查詢語句中相同數(shù)據(jù)庫表的相同候選鍵的重分布代價(jià)進(jìn)行匯總,得到每個(gè)數(shù)據(jù)庫表中每個(gè)候選鍵的重分布總代價(jià);以及分布鍵確定模塊,用于利用將每個(gè)數(shù)據(jù)庫表中重分布總代價(jià)最高的候選鍵作為數(shù)據(jù)庫表的分布鍵。
10、本發(fā)明的第三方面提供了一種電子設(shè)備,包括:一個(gè)或多個(gè)處理器;存儲器,用于存儲一個(gè)或多個(gè)計(jì)算機(jī)程序,當(dāng)一個(gè)或多個(gè)處理器執(zhí)行一個(gè)或多個(gè)計(jì)算機(jī)程序時(shí)以實(shí)現(xiàn)根據(jù)上述分布式數(shù)據(jù)庫中分布鍵的確定方法的步驟。
11、本發(fā)明的第四方面還提供了一種計(jì)算機(jī)可讀存儲介質(zhì),其上存儲有計(jì)算機(jī)程序或指令,計(jì)算機(jī)程序或指令被處理器執(zhí)行時(shí)實(shí)現(xiàn)根據(jù)上述分布式數(shù)據(jù)庫中分布鍵的確定方法的步驟。
12、本發(fā)明的第五方面還提供了一種計(jì)算機(jī)程序產(chǎn)品,包括計(jì)算機(jī)程序或指令,計(jì)算機(jī)程序或指令被處理器執(zhí)行時(shí)實(shí)現(xiàn)根據(jù)上述分布式數(shù)據(jù)庫中分布鍵的確定方法的步驟。
13、本發(fā)明的分布式數(shù)據(jù)庫中分布鍵的確定方法的技術(shù)效果體現(xiàn)在1)分布鍵信息收集過程與數(shù)據(jù)庫解耦,省去了信息收集的前置部署工作。2)靜態(tài)分析業(yè)務(wù)sql語句,分布鍵分析階段無需優(yōu)化器和執(zhí)行器等耗時(shí)操作的參與,單個(gè)sql語句的分析效率大大提升。3)只處理和分布鍵相關(guān)的業(yè)務(wù)sql語句,無關(guān)sql自動(dòng)過濾,減少了信息收集的整體工作量。
14、綜上,本發(fā)明通過獨(dú)立的分析工具進(jìn)行分布鍵分析,無需提前部署數(shù)據(jù)庫,實(shí)現(xiàn)了與數(shù)據(jù)庫的解耦。此外,分布鍵信息獲取時(shí)每個(gè)sql語句均不需要經(jīng)過優(yōu)化器和執(zhí)行器模塊,降低了操作復(fù)雜度,提高分布鍵確定效率。此外,本發(fā)明不僅無需執(zhí)行每個(gè)業(yè)務(wù)sql語句,同時(shí)還能夠確定每個(gè)數(shù)據(jù)庫表中最優(yōu)的分布鍵,減少數(shù)據(jù)庫節(jié)點(diǎn)之間的重分布操作,減少了數(shù)據(jù)庫資源的消耗,提升了數(shù)據(jù)庫整體運(yùn)行效率。