本發(fā)明涉及通信領(lǐng)域,具體而言,涉及一種數(shù)據(jù)庫的查詢方法及裝置。
背景技術(shù):
對于關(guān)系數(shù)據(jù)庫查詢,相關(guān)技術(shù)中的效率優(yōu)化辦法是采用適當(dāng)?shù)乃饕?,必要時(shí)使用結(jié)構(gòu)化查詢語言(Structured Query Language,簡稱為SQL)注釋(如Oracle hint)來指定數(shù)據(jù)庫查詢優(yōu)化方式。對于一些場景,由于數(shù)據(jù)分布的不均勻、Hint不是最優(yōu)方式,導(dǎo)致無法達(dá)到實(shí)際效率的最優(yōu)狀態(tài)。
針對相關(guān)技術(shù)中對于數(shù)據(jù)庫的查詢方式比較單一的問題,目前尚未提出有效的解決方案。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的主要目的在于提供一種數(shù)據(jù)庫的查詢方法及裝置,以至少解決相關(guān)技術(shù)中對于數(shù)據(jù)庫的查詢方式比較單一的問題。
根據(jù)本發(fā)明的一個(gè)方面,提供了一種數(shù)據(jù)庫的查詢方法,包括:獲取用于指示查詢數(shù)據(jù)庫的查詢場景的多個(gè)參數(shù):依據(jù)所述多個(gè)參數(shù)進(jìn)行綜合決策,并按照與決策結(jié)果對應(yīng)的查詢類型執(zhí)行對所述數(shù)據(jù)庫的查詢。
進(jìn)一步地,獲取用于指示查詢數(shù)據(jù)庫的查詢場景的多個(gè)參數(shù)包括:獲取第一預(yù)設(shè)統(tǒng)計(jì)時(shí)間內(nèi)查詢條件中限制返回的數(shù)據(jù)量與從所述數(shù)據(jù)庫查詢的數(shù)據(jù)總量之比的第一參數(shù);獲取在第二預(yù)設(shè)統(tǒng)計(jì)時(shí)間內(nèi)所述數(shù)據(jù)庫內(nèi)需要查詢的數(shù)據(jù)索引范圍與所述數(shù)據(jù)庫中所有數(shù)據(jù)的索引范圍之比的第二參數(shù);獲取在第三預(yù)設(shè)統(tǒng)計(jì)時(shí)間內(nèi)查詢條件中的數(shù)據(jù)庫分區(qū)與總分區(qū)之比的第三參數(shù)。
進(jìn)一步地,依據(jù)所述多個(gè)參數(shù)進(jìn)行綜合決策,并按照與決策結(jié)果對應(yīng)的查詢類型執(zhí)行對所述數(shù)據(jù)庫的查詢包括:獲取所述第一參數(shù)分別與預(yù)設(shè)的第一閾值和第二閾值進(jìn)行比較后的第一比較結(jié)果,并依據(jù)所述第一比較結(jié)果確定是否將所述數(shù)據(jù)庫查詢SQL拆分為多個(gè)子SQL;在確定是否拆分為多個(gè)子SQL之后,獲取所述第二參數(shù)與所述第三參數(shù)之間較小的參數(shù),并將所述較小的參數(shù)分別與預(yù)設(shè)的第三閾值和第四閾值進(jìn)行比較,得到第二比較結(jié)果,并依據(jù)所述第二比較結(jié)果隨機(jī)選擇指定索引查詢方式進(jìn)行查詢或全表掃描查詢方式進(jìn)行查詢。
進(jìn)一步地,依據(jù)所述第一比較結(jié)果確定是否將所述數(shù)據(jù)庫查詢SQL拆分為 多個(gè)子SQL包括:在所述第一比較結(jié)果小于等于所述第一閾值時(shí),拆分為多個(gè)子SQL;或,在所述第一比較結(jié)果大于等于所述第二閾值時(shí),不拆分為多個(gè)子SQL;或,在所述第一比較結(jié)果大于所述第一閾值且小于所述第二閾值時(shí),隨機(jī)選擇是否拆分為多個(gè)子SQL;依據(jù)所述第二比較結(jié)果確定采用指定索引查詢或全表掃描查詢包括:在所述第二比較結(jié)果小于等于所述第三閾值時(shí),采用指定索引查詢;或,在所述第二比較結(jié)果大于等于第四閾值時(shí),采用全表掃描查詢;或,在所述第二比較結(jié)果大于所述第三閾值且小于所述第四閾值時(shí),隨機(jī)選擇所述指定索引查詢或所述全表掃描查詢。
進(jìn)一步地,在依據(jù)所述指定參數(shù)與預(yù)定閾值的比較結(jié)果執(zhí)行對所述數(shù)據(jù)庫的查詢之后,所述方法還包括:保存所述用于指示查詢所述數(shù)據(jù)庫數(shù)據(jù)的所述多個(gè)參數(shù),以及采用當(dāng)前的查詢類型查詢所述數(shù)據(jù)庫的耗時(shí)。
進(jìn)一步地,在保存所述用于指示查詢所述數(shù)據(jù)庫數(shù)據(jù)的所述多個(gè)參數(shù),以及采用當(dāng)前的查詢類型查詢所述數(shù)據(jù)庫的耗時(shí)之后,所述方法還包括:獲取本地保存的與查詢類型對應(yīng)的查詢耗時(shí),其中,所述查詢類型包括:所述全表掃描查詢和所述指定索引查詢;比較多個(gè)所述查詢耗時(shí),并按照比較結(jié)果調(diào)整所述第一閾值、所述第二閾值、所述第三閾值以及所述第四閾值的取值。
根據(jù)本發(fā)明的另一個(gè)方面,提供了一種數(shù)據(jù)庫的查詢裝置,包括:第一獲取模塊,用于獲取用于指示查詢數(shù)據(jù)庫的查詢場景的多個(gè)參數(shù):查詢模塊,用于依據(jù)所述多個(gè)參數(shù)進(jìn)行綜合決策,并按照與決策結(jié)果對應(yīng)的查詢類型執(zhí)行對所述數(shù)據(jù)庫的查詢。
進(jìn)一步地,所述第一獲取模塊包括:第一獲取單元,用于獲取第一預(yù)設(shè)統(tǒng)計(jì)時(shí)間內(nèi)查詢條件中限制返回的數(shù)據(jù)量與從所述數(shù)據(jù)庫查詢的數(shù)據(jù)總量之比的第一參數(shù);第二獲取單元,用于獲取在第二預(yù)設(shè)統(tǒng)計(jì)時(shí)間內(nèi)所述數(shù)據(jù)庫內(nèi)需要查詢的數(shù)據(jù)索引范圍與所述數(shù)據(jù)庫中所有數(shù)據(jù)的索引范圍之比的第二參數(shù);第三獲取單元,用于獲取在第三預(yù)設(shè)統(tǒng)計(jì)時(shí)間內(nèi)查詢條件中的數(shù)據(jù)庫分區(qū)與總分區(qū)之比的第三參數(shù)。
進(jìn)一步地,所述查詢模塊包括:確定單元,用于獲取所述第一參數(shù)分別與預(yù)設(shè)的第一閾值和第二閾值進(jìn)行比較后的第一比較結(jié)果,并依據(jù)所述第一比較結(jié)果確定是否將所述數(shù)據(jù)庫查詢SQL拆分為多個(gè)子SQL;查詢單元,用于在確定是否拆分為多個(gè)子SQL之后,獲取所述第二參數(shù)與所述第三參數(shù)之間較小的參數(shù),并將所述較小的參數(shù)分別與預(yù)設(shè)的第三閾值和第四閾值進(jìn)行比較,得到第二比較結(jié)果,并依據(jù)所述第二比較結(jié)果隨機(jī)選擇指定索引查詢方式進(jìn)行查詢或全表掃描查詢方式進(jìn)行查詢。
進(jìn)一步地,所述確定單元,還用于在所述第一比較結(jié)果小于等于所述第一 閾值時(shí),拆分為多個(gè)子SQL;或,在所述第一比較結(jié)果大于等于所述第二閾值時(shí),不拆分為多個(gè)子SQL;或,在所述第一比較結(jié)果大于所述第一閾值且小于所述第二閾值時(shí),隨機(jī)選擇是否拆分為多個(gè)子SQL;所述查詢單元,還用于在所述第二比較結(jié)果小于等于所述第三閾值時(shí),采用指定索引查詢;或,在所述第二比較結(jié)果大于等于第四閾值時(shí),采用全表掃描查詢;或,在所述第二比較結(jié)果大于所述第三閾值且小于所述第四閾值時(shí),隨機(jī)選擇所述指定索引查詢或所述全表掃描查詢。
通過本發(fā)明,采用獲取用于指示查詢數(shù)據(jù)庫的查詢場景的多個(gè)參數(shù),進(jìn)而對該多個(gè)參數(shù)進(jìn)行綜合決策,并按照決策結(jié)果對應(yīng)的查詢類型指定對數(shù)據(jù)庫的查詢;可見,在本實(shí)施例中是通過獲取查詢場景的多個(gè)參數(shù),并不僅僅是用hint來指定數(shù)據(jù)庫進(jìn)行查詢,通過該多個(gè)參數(shù)的綜合決定能夠更好的適應(yīng)場景采用優(yōu)化的查詢的方式,解決了相關(guān)技術(shù)中對于數(shù)據(jù)庫的查詢方式比較單一的問題,提高了數(shù)據(jù)庫的查詢效率。
附圖說明
此處所說明的附圖用來提供對本發(fā)明的進(jìn)一步理解,構(gòu)成本申請的一部分,本發(fā)明的示意性實(shí)施例及其說明用于解釋本發(fā)明,并不構(gòu)成對本發(fā)明的不當(dāng)限定。在附圖中:
圖1是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)庫的查詢方法的流程圖;
圖2是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)庫的查詢裝置結(jié)構(gòu)框圖;
圖3是根據(jù)本發(fā)明可選實(shí)施例的數(shù)據(jù)庫的查詢裝置可選結(jié)構(gòu)框圖一;
圖4是根據(jù)本發(fā)明可選實(shí)施例的數(shù)據(jù)庫的查詢裝置可選結(jié)構(gòu)框圖二;
圖5是根據(jù)本發(fā)明可選實(shí)施例的適應(yīng)使用場景的數(shù)據(jù)查詢算法的流程圖。
具體實(shí)施方式
需要說明的是,在不沖突的情況下,本申請中的實(shí)施例及實(shí)施例中的特征可以相互組合。下面將參考附圖并結(jié)合實(shí)施例來詳細(xì)說明本發(fā)明。
在附圖的流程圖示出的步驟可以在諸如一組計(jì)算機(jī)可執(zhí)行指令的計(jì)算機(jī)系統(tǒng)中執(zhí)行,并且,雖然在流程圖中示出了邏輯順序,但是在某些情況下,可以以不同于此處的順序執(zhí)行所示出或描述的步驟。
本實(shí)施例提供了一種數(shù)據(jù)庫的查詢方法,圖1是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)庫的查詢方法的流程圖,如圖1所示,該方法的步驟包括:
步驟S102:獲取用于指示查詢數(shù)據(jù)庫的查詢場景的多個(gè)參數(shù):
步驟S104:依據(jù)多個(gè)參數(shù)進(jìn)行綜合決策,并按照與決策結(jié)果對應(yīng)的查詢類型執(zhí)行對數(shù)據(jù)庫的查詢。
通過本實(shí)施例中的上述步驟S102與步驟S104,采用獲取用于指示查詢數(shù)據(jù)庫的查詢場景的多個(gè)參數(shù),進(jìn)而對該多個(gè)參數(shù)進(jìn)行綜合決策,并按照決策結(jié)果對應(yīng)的查詢類型指定對數(shù)據(jù)庫的查詢;可見,在本實(shí)施例中是通過獲取查詢場景的多個(gè)參數(shù),并不僅僅是用hint來指定數(shù)據(jù)庫進(jìn)行查詢,通過該多個(gè)參數(shù)的綜合決定能夠更好的適應(yīng)場景采用優(yōu)化的查詢的方式,解決了相關(guān)技術(shù)中對于數(shù)據(jù)庫的查詢方式比較單一的問題,提高了數(shù)據(jù)庫的查詢效率。
需要說明的是,本實(shí)施例中涉及到的該多個(gè)參數(shù)可以預(yù)設(shè)獲得相應(yīng)的值,進(jìn)而可以在使用過程中可以動(dòng)態(tài)調(diào)整的。
而對于本實(shí)施例中涉及到的獲取用于指示查詢數(shù)據(jù)庫的查詢場景的多個(gè)參數(shù)的方式,在本實(shí)施例的可選實(shí)施方式可以通過如下方式來實(shí)現(xiàn):
步驟S11:獲取第一預(yù)設(shè)統(tǒng)計(jì)時(shí)間內(nèi)查詢條件中限制返回的數(shù)據(jù)量與從數(shù)據(jù)庫查詢的數(shù)據(jù)總量之比的第一參數(shù);
步驟S12:獲取在第二預(yù)設(shè)統(tǒng)計(jì)時(shí)間內(nèi)數(shù)據(jù)庫內(nèi)需要查詢的數(shù)據(jù)索引范圍與數(shù)據(jù)庫中所有數(shù)據(jù)的索引范圍之比的第二參數(shù);
步驟S13:獲取在第三預(yù)設(shè)統(tǒng)計(jì)時(shí)間內(nèi)查詢條件中的數(shù)據(jù)庫分區(qū)與總分區(qū)之比的第三參數(shù)。
可見,通過上述步驟S11至步驟S13可以獲取查詢場景中的三個(gè)不同參數(shù),但該三個(gè)參數(shù)僅僅是用來進(jìn)行舉例說明,并不構(gòu)成對本發(fā)明的限定;也就是說,可以根據(jù)實(shí)際情況獲取更多的參數(shù),此外,上述第一預(yù)設(shè)統(tǒng)計(jì)時(shí)間、第二預(yù)設(shè)統(tǒng)計(jì)時(shí)間以及第三預(yù)設(shè)統(tǒng)計(jì)時(shí)間在本可選實(shí)施例中可以相等也可以不相等。
在本實(shí)施例的另一個(gè)可選實(shí)施方式中,對于本實(shí)施例涉及到的依據(jù)多個(gè)參數(shù)進(jìn)行綜合決策,并按照與決策結(jié)果對應(yīng)的查詢類型執(zhí)行對數(shù)據(jù)庫的查詢的方式可以通過如下方式來實(shí)現(xiàn):
步驟S21:獲取第一參數(shù)分別與預(yù)設(shè)的第一閾值和第二閾值進(jìn)行比較后的第一比較結(jié)果,并依據(jù)第一比較結(jié)果確定是否將數(shù)據(jù)庫查詢SQL拆分為多個(gè)子SQL;
步驟S22:在確定是否拆分多個(gè)子SQL之后,獲取第二參數(shù)與第三參數(shù)之間較小的參數(shù),并將較小的參數(shù)分別與預(yù)設(shè)的第三閾值和第四閾值進(jìn)行比較,得到第二比較結(jié)果,并依據(jù)第二比較結(jié)果隨機(jī)選擇指定索引查詢方式進(jìn)行查詢或全 表掃描查詢方式進(jìn)行查詢。
通過上述步驟S21和S22,可知,通過第一參數(shù)、第二參數(shù)以及第三參數(shù)與預(yù)定閾值進(jìn)行比較之后,確定是否要對數(shù)據(jù)庫進(jìn)行拆分,進(jìn)而確定對于拆分或未拆分的數(shù)據(jù)庫進(jìn)行指定索引查詢或全表掃描查詢;通過該方式進(jìn)一步細(xì)化了在對數(shù)據(jù)庫進(jìn)行查詢時(shí)考慮的因素,在綜合考慮到查詢場景的多個(gè)參數(shù)之后,能夠使得查詢更加優(yōu)化。而對于上述步驟S21和S22中具體如何執(zhí)行對數(shù)據(jù)庫的查詢,可以通過如下可選方式來實(shí)現(xiàn);
對于上述步驟S21中的依據(jù)第一比較結(jié)果確定是否將數(shù)據(jù)庫拆分為多個(gè)子SQL可以通過如下方式來實(shí)現(xiàn):在第一比較結(jié)果小于等于第一閾值時(shí),拆分為多個(gè)子SQL;或,在第一比較結(jié)果大于等于第二閾值時(shí),不拆分為多個(gè)子SQL;或,在第一比較結(jié)果大于第一閾值且小于第二閾值時(shí),隨機(jī)選擇是否拆分為多個(gè)子SQL;
而對于上述步驟S22中的依據(jù)第二比較結(jié)果確定采用指定索引查詢或全表掃描查詢的方式可以通過如下方式來實(shí)現(xiàn):在第二比較結(jié)果小于等于第三閾值時(shí),采用指定索引查詢;或,在第二比較結(jié)果大于等于第四閾值時(shí),采用全表掃描查詢;或,在第二比較結(jié)果大于第三閾值且小于第四閾值時(shí),隨機(jī)選擇指定索引查詢或全表掃描查詢。
可見,在上述步驟S21和S22中給出了一種可選的如何在綜合考慮到查詢場景的多個(gè)參數(shù)之后,選取查詢方式。
而在上述步驟S22之后,即在依據(jù)指定參數(shù)與預(yù)定閾值的比較結(jié)果執(zhí)行對數(shù)據(jù)庫的查詢之后,本實(shí)施例的方法還可以包括:保存用于指示查詢數(shù)據(jù)庫數(shù)據(jù)的多個(gè)參數(shù),以及采用當(dāng)前的查詢類型查詢數(shù)據(jù)庫的耗時(shí)。也就是說,每次執(zhí)行查詢之后都會(huì)保存查詢采用的參數(shù)、預(yù)定閾值以及查詢的耗時(shí)。
而對于上述保存的數(shù)據(jù),在保存用于指示查詢數(shù)據(jù)庫數(shù)據(jù)的多個(gè)參數(shù),以及采用當(dāng)前的查詢類型查詢數(shù)據(jù)庫的耗時(shí)之后,本實(shí)施例的方法還可以包括:
獲取本地保存的與查詢類型對應(yīng)的查詢耗時(shí),其中,查詢類型包括:全表掃描查詢和指定索引查詢;
比較多個(gè)查詢耗時(shí),并按照比較結(jié)果調(diào)整第一閾值、第二閾值、第三閾值以及第四閾值的取值。
也就是說,通過保存的數(shù)據(jù),進(jìn)行比較得出最優(yōu)或最合適的查詢方式為以后的查詢提供可靠的依據(jù)。
在本實(shí)施例中還提供了一種數(shù)據(jù)庫的查詢裝置,該裝置用于實(shí)現(xiàn)上述實(shí)施例及可選實(shí)施方式,已經(jīng)進(jìn)行過說明的不再贅述。如以下所使用的,術(shù)語“模塊” “單元”可以實(shí)現(xiàn)預(yù)定功能的軟件和/或硬件的組合。盡管以下實(shí)施例所描述的裝置較佳地以軟件來實(shí)現(xiàn),但是硬件,或者軟件和硬件的組合的實(shí)現(xiàn)也是可能并被構(gòu)想的。
圖2是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)庫的查詢裝置結(jié)構(gòu)框圖,如圖2所示,該裝置包括:第一獲取模塊22,用于獲取用于指示查詢數(shù)據(jù)庫的查詢場景的多個(gè)參數(shù):查詢模塊24,與獲取模塊22耦合連接,用于依據(jù)多個(gè)參數(shù)進(jìn)行綜合決策,并按照與決策結(jié)果對應(yīng)的查詢類型執(zhí)行對數(shù)據(jù)庫的查詢。
圖3是根據(jù)本發(fā)明可選實(shí)施例的數(shù)據(jù)庫的查詢裝置可選結(jié)構(gòu)框圖一,如圖3所示,該第一獲取模塊22包括:第一獲取單元32,用于獲取第一預(yù)設(shè)統(tǒng)計(jì)時(shí)間內(nèi)查詢條件中限制返回的數(shù)據(jù)量與從數(shù)據(jù)庫查詢的數(shù)據(jù)總量之比的第一參數(shù);第二獲取單元34,與第一獲取單元32耦合連接,用于獲取在第二預(yù)設(shè)統(tǒng)計(jì)時(shí)間內(nèi)數(shù)據(jù)庫內(nèi)需要查詢的數(shù)據(jù)索引范圍與數(shù)據(jù)庫中所有數(shù)據(jù)的索引范圍之比的第二參數(shù);第三獲取單元36,與第二獲取單元34耦合連接,用于獲取在第三預(yù)設(shè)統(tǒng)計(jì)時(shí)間內(nèi)查詢條件中的數(shù)據(jù)庫分區(qū)與總分區(qū)之比的第三參數(shù)。
圖4是根據(jù)本發(fā)明可選實(shí)施例的數(shù)據(jù)庫的查詢裝置可選結(jié)構(gòu)框圖二,如圖4所示,查詢模塊24包括:確定單元42,用于獲取第一參數(shù)分別與預(yù)設(shè)的第一閾值和第二閾值進(jìn)行比較后的第一比較結(jié)果,并依據(jù)第一比較結(jié)果確定是否將數(shù)據(jù)庫查詢SQL拆分為多個(gè)子SQL;查詢單元44,與確定單元42耦合連接,用于在確定是否拆分多個(gè)子SQL之后,獲取第二參數(shù)與第三參數(shù)之間較小的參數(shù),并將較小的參數(shù)分別與預(yù)設(shè)的第三閾值和第四閾值進(jìn)行比較,得到第二比較結(jié)果,并依據(jù)第二比較結(jié)果隨機(jī)選擇指定索引查詢方式進(jìn)行查詢或全表掃描查詢方式進(jìn)行查詢。
可選地,該確定單元42,還用于在第一比較結(jié)果小于等于第一閾值時(shí),拆分為多個(gè)子SQL;或,在第一比較結(jié)果大于等于第二閾值時(shí),不拆分為多個(gè)子SQL;或,在第一比較結(jié)果大于第一閾值且小于第二閾值時(shí),隨機(jī)選擇是否拆分為多個(gè)子SQL;
可選地,查詢單元44,還用于在第二比較結(jié)果小于等于第三閾值時(shí),采用指定索引查詢;或,在第二比較結(jié)果大于等于第四閾值時(shí),采用全表掃描查詢;或,在第二比較結(jié)果大于第三閾值且小于第四閾值時(shí),隨機(jī)選擇指定索引查詢或全表掃描查詢。
可選地,本實(shí)施例涉及到的裝置還可以包括:在依據(jù)指定參數(shù)與預(yù)定閾值的比較結(jié)果執(zhí)行對數(shù)據(jù)庫的查詢之后,該裝置還包括:保存模塊,與查詢模塊22耦合連接,保存用于指示查詢數(shù)據(jù)庫數(shù)據(jù)的多個(gè)參數(shù),以及采用當(dāng)前的查詢類型查詢數(shù)據(jù)庫的耗時(shí)。
可選地,在保存用于指示查詢數(shù)據(jù)庫數(shù)據(jù)的多個(gè)參數(shù),以及采用當(dāng)前的查詢類型查詢數(shù)據(jù)庫的耗時(shí)之后,該裝置還可以包括:第二獲取模塊,與保存模塊耦合連接,用于獲取本地保存的與查詢類型對應(yīng)的查詢耗時(shí),其中,查詢類型包括:全表掃描查詢和指定索引查詢;
比較模塊,與第二獲取模塊耦合連接,用于比較多個(gè)查詢耗時(shí),并按照比較結(jié)果調(diào)整第一閾值、第二閾值、第三閾值以及第四閾值的取值。
下面通過本發(fā)明的可選實(shí)施例對本發(fā)明進(jìn)行舉例說明;
本可選實(shí)施例提供了一種自適應(yīng)使用場景的數(shù)據(jù)查詢算法,通過本可選實(shí)施例能夠讓數(shù)據(jù)查詢隨使用場景的變化自動(dòng)選取優(yōu)化的方式。
本可選實(shí)施例采用了根據(jù)查詢的類型、查詢的索引范圍、查詢的數(shù)據(jù)表分區(qū)大小、查詢的數(shù)據(jù)量估算與查詢返回條數(shù)限制的參數(shù),綜合評定后選取結(jié)構(gòu)化查詢語言(Structured Query Language,簡稱為SQL)的優(yōu)化方式,SQL優(yōu)化方式包括按分區(qū)索引拆分子SQL語句、hint選擇等,并根據(jù)每次查詢耗用的時(shí)間統(tǒng)計(jì)來作為下一次選取優(yōu)化方式的依據(jù)。
下面對于本可選實(shí)施例中涉及到的查詢的類型、查詢的索引范圍、查詢的數(shù)據(jù)表分區(qū)大小、查詢的數(shù)據(jù)量估算與查詢返回條數(shù)限制的參數(shù)進(jìn)行說明;
對于本可選實(shí)施例的中查詢的類型一般有實(shí)時(shí)查詢與統(tǒng)計(jì)查詢,實(shí)時(shí)查詢對時(shí)間要求高、而對返回的數(shù)據(jù)量有限制;統(tǒng)計(jì)查詢對時(shí)間要求低,但往往要求統(tǒng)計(jì)全部的數(shù)據(jù)。因此,對于這兩種查詢類型:實(shí)時(shí)查詢更偏重按索引掃描,而統(tǒng)計(jì)查詢更偏向于分區(qū)內(nèi)的全表掃描。
對于本可選實(shí)施例涉及到的查詢的索引范圍對hint的選擇影響比較大,如果查詢的索引范圍已經(jīng)達(dá)到分區(qū)內(nèi)這個(gè)索引全部數(shù)據(jù)的1/2以上,而且需要返回滿足條件的全部數(shù)據(jù)時(shí),適合于全表掃描;如果查詢的索引范圍小于分區(qū)內(nèi)這個(gè)索引全部數(shù)據(jù)的1/5時(shí),適合于按索引掃描。對于索引范圍占全部范圍的1/5至1/2的場景,其效率受數(shù)據(jù)庫服務(wù)器、存儲(chǔ)設(shè)備硬軟件配置的影響比較大,那么采用哪種方式,可以更進(jìn)一步的采用以往查詢耗用的時(shí)間統(tǒng)計(jì)來作為下一次選取優(yōu)化方式的依據(jù)。
此外,需要說明的是對于索引范圍難以判斷的場景,比如時(shí)間索引下的數(shù)據(jù)缺失、位置索引下的位置變化,適用于采用歷史查詢耗用的時(shí)間統(tǒng)計(jì)來作為下一次選取優(yōu)化方式的依據(jù)。
在本可選實(shí)施例中對于拆分子SQL的場景,如果有返回條數(shù)限制,那么可以依據(jù)數(shù)據(jù)量估算來拆分為子SQL,具體情況例如查詢1個(gè)月的數(shù)據(jù),查詢返回條數(shù)限制為10萬條,而1個(gè)月的數(shù)據(jù)估算有3000萬條,那么可以拆分為30 個(gè)1天來查詢,這樣只用查詢1天的數(shù)據(jù)就能滿足要求。
而對于本實(shí)施例中的查詢1周的大量數(shù)據(jù),按位置匯總,數(shù)據(jù)表分區(qū)為1天,可以拆分為7個(gè)1天的子查詢,避免1周大數(shù)據(jù)匯總帶來的響應(yīng)延遲。
圖5是根據(jù)本發(fā)明可選實(shí)施例的適應(yīng)使用場景的數(shù)據(jù)查詢算法的流程圖,如圖5所示,基于上述說明,本可選實(shí)施例的自適應(yīng)使用場景的數(shù)據(jù)查詢算法可以通過如下步驟來實(shí)現(xiàn):
步驟S502:獲取查詢類型,確定參數(shù)A,其中,參數(shù)A=1為實(shí)時(shí)查詢,A=0為報(bào)表統(tǒng)計(jì)查詢;
步驟S504:判斷查詢的索引范圍,確定參數(shù)B,其中,參數(shù)B=查詢索引范圍/所有數(shù)據(jù)范圍,如數(shù)據(jù)表保存1個(gè)月數(shù)據(jù),按時(shí)間索引,查詢1天數(shù)據(jù),則B=1/30;
步驟S506:判斷是否分區(qū),及分區(qū)大小,確定參數(shù)C;其中,如該數(shù)據(jù)表沒有分區(qū),則C=1,如果有分區(qū)且按時(shí)間分區(qū)、分區(qū)大小為1周,查詢條件中時(shí)間范圍是1天,則C=1/7;
步驟S508:判斷查詢是否有返回條數(shù)限制,以及查詢條件中時(shí)間范圍內(nèi)的數(shù)據(jù)量估算,確定參數(shù)D。比如所查詢的數(shù)據(jù)表1天數(shù)據(jù)量估算為100萬,而查詢返回條數(shù)限制為10萬,則D=1/10;
步驟S510:按照參數(shù)D,當(dāng)D<=t1時(shí)拆分子SQL,當(dāng)D>=t2時(shí)不拆分子SQL,t1<D<t2時(shí)隨機(jī)選擇是否拆分子SQL;進(jìn)而按照value=min(B,C)的值來確定是否采用指定索引的方式:value<=k1時(shí)指定索引查詢;value>=k2時(shí)全表掃描查詢;k1<value<k2時(shí),隨機(jī)采用是否指定索引;
需要說明的是value=min(B,C)該公式表示取B和C中較小的值作為value的值;
步驟S512:保存每次查詢使用的參數(shù)、t1、t2、k1、k2以及查詢耗時(shí);
步驟S514:根據(jù)保存的耗時(shí)數(shù)據(jù)、根據(jù)參數(shù)A的不同分開統(tǒng)計(jì),判斷t1、t2、k1、k2的取值是否需要調(diào)整。
通過本可選實(shí)施例的方式,針對大數(shù)據(jù)表的數(shù)據(jù)統(tǒng)計(jì),不用依賴固定的SQL來滿足效率優(yōu)化目的,而是靈活根據(jù)實(shí)際使用場景采取適當(dāng)?shù)膬?yōu)化方式,滿足業(yè)務(wù)統(tǒng)計(jì)的同時(shí)大大提升了查詢效率。
以上僅為本發(fā)明的可選實(shí)施例而已,并不用于限制本發(fā)明,對于本領(lǐng)域的技術(shù)人員來說,本發(fā)明可以有各種更改和變化。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。