龔建華
(國(guó)防信息學(xué)院,武漢 430010)
Oracle數(shù)據(jù)庫(kù)全文檢索性能研究
龔建華
(國(guó)防信息學(xué)院,武漢430010)
隨著全文檢索應(yīng)用場(chǎng)景越來(lái)越多,更加需要了解數(shù)據(jù)庫(kù)全文檢索的性能。介紹Oracle數(shù)據(jù)庫(kù)全文檢索的設(shè)置方法,然后加載測(cè)試數(shù)據(jù),對(duì)全文檢索和模糊查詢的性能進(jìn)行比對(duì)測(cè)試,最后對(duì)全文檢索的查全能力和查詢速度進(jìn)行詳細(xì)分析。
數(shù)據(jù)庫(kù);全文檢索;模糊查詢
隨著信息社會(huì)的不斷發(fā)展,獲取信息比過(guò)去任何時(shí)候都變得更加容易,人們?cè)谂龅揭呻y問(wèn)題時(shí)會(huì)主動(dòng)查詢信息,查詢信息的頻率比過(guò)去高出了很多倍。生產(chǎn)生活中涌現(xiàn)的大量信息通常以文本形式呈現(xiàn),很多信息還沒(méi)有來(lái)得及結(jié)構(gòu)化,或者這些根本沒(méi)有必要進(jìn)行結(jié)構(gòu)化,導(dǎo)致目前從文本中查找信息是信息查詢的主流形式。由于文本難以量化比對(duì)大小,因此與數(shù)量、日期類型的數(shù)據(jù)查詢相比,文本的比對(duì)更復(fù)雜、更費(fèi)時(shí)。
數(shù)據(jù)庫(kù)全文檢索是在數(shù)據(jù)表文本字段上建立全文索引,文本查詢完全在索引上進(jìn)行,毋庸置疑,建立全文索引可以提高文本數(shù)據(jù)查詢的效率,但是查詢效率到底能夠提高多少,查詢效率與哪些因素有關(guān),這些都是需要深入研究的問(wèn)題。本文以O(shè)racle10g企業(yè)版10.2.0.1.0版為研究對(duì)象,對(duì)比研究Oracle數(shù)據(jù)庫(kù)全文檢索性能。
1.1解鎖CTXSYS用戶
Oracle數(shù)據(jù)庫(kù)建立全文檢索在的工具包在CTXSYS模式中,安裝數(shù)據(jù)庫(kù)時(shí),默認(rèn)情況下CTXSYS用戶是鎖定的,在使用CTXSYS工具包之前,必須解鎖CTXSYS用戶,具體操作如下:
1.2CTX_DDL包授權(quán)
CTX_DDL包是設(shè)置全文索引的工具,因此在創(chuàng)建全文索引之前需要獲得該包的執(zhí)行權(quán)限,例如把該包的執(zhí)行權(quán)限授予SCOTT用戶,具體操作如下:
1.3創(chuàng)建中文分詞名稱
在Oracle數(shù)據(jù)庫(kù)中,針對(duì)不同國(guó)家的語(yǔ)言提供了不同的分詞器,常用的中文分詞器主要有CHINESE_VGRAM_LEXER和 CHINESE_LEXER,其中CHINESE_LEXER是新的漢語(yǔ)分詞器,支持中文和U-nicode字符集,該分詞器最大的改進(jìn)是能夠認(rèn)識(shí)大部分常用漢語(yǔ)詞匯,因此能夠更有效地分離詞匯。這里選用CHINESE_LEXER分詞器,使用該分詞器之前,需要建一個(gè)分詞器實(shí)體名,操作如下:
其中,CHINESE_LEXER是分詞器,MY_CHI-NESE_LEXER是分詞器實(shí)體名。
1.4創(chuàng)建全文索引
(1)創(chuàng)建數(shù)據(jù)表
在SCOTT模式下,創(chuàng)建一張用于存儲(chǔ)大量文本的數(shù)據(jù)表,操作如下:
其中,TXT字段是clob類型,可以存儲(chǔ)大量文本,單條記錄可以高達(dá)4G容量,NAME用于文本來(lái)源的文件名稱,ID只是一個(gè)編號(hào)。
(2)創(chuàng)建全文索引
Oracle數(shù)據(jù)的全文索引有 CONTEXT、CTXCAT、CTXRULE、CTXXPATH等四種類型,對(duì)DT表的TXT字段創(chuàng)建CONTEXT類型全文索引,操作如下:
create index IDX_DTTXT on SCOTT.DT(TXT)indextype is ctxsys.context parameters('LEXER MY_CHINESE_LEXER');
執(zhí)行這條命令即可創(chuàng)建全文索引,其中ctxsys.context是全文索引類型,'LEXER MY_CHINESE_LEXER'表示使用名稱為MY_CHINESE_LEXER的分詞器。
由于全文檢索是在全文索引的基礎(chǔ)上做檢索,從理論上講應(yīng)該比模糊查詢直接針對(duì)文本做查詢要快一些,下面通過(guò)對(duì)比分析研究全文檢索的檢索速度。
2.1給DT表加載測(cè)試數(shù)據(jù)
為了能夠重現(xiàn)測(cè)試結(jié)論,這里選用中文版HTML格式JAVADOC系列文檔作為測(cè)試數(shù)據(jù),該JAVADOC文檔集共有8964篇、約198M字節(jié),是Java語(yǔ)言的編程指南,每篇文檔包含中英文字符,可作為測(cè)試數(shù)據(jù)。
向Oracle數(shù)據(jù)庫(kù)加載CLOB字段內(nèi)容時(shí),通常不能直接插入,而應(yīng)該采用流的方式加入,所以這些測(cè)試數(shù)據(jù)需要編寫(xiě)程序加載到DT表中,具體操作略,數(shù)據(jù)加載完畢后,DT表所占表空間大小約550M字節(jié)。
2.2維護(hù)全文索引
每次更新DT表TXT字段的數(shù)據(jù)后,應(yīng)當(dāng)及時(shí)進(jìn)行全文索引維護(hù),即同步和優(yōu)化,使全文索引與TXT字段的內(nèi)容吻合,具體操作如下:
2.3全文檢索與模糊查詢對(duì)比測(cè)試
(1)查詢工具與查詢命令
使用PL/SQL Developer 9.0中文版為查詢工具,使用下列語(yǔ)句來(lái)對(duì)比測(cè)試結(jié)果
模糊查詢的語(yǔ)句為:
(2)查詢方法
為提高對(duì)比分析的精確性,每次查詢盡可能采用一致的環(huán)境,使用相同的查詢工具,在相同的查詢窗口,每次查詢前等待CPU空閑。PL/SQL Developer 9.0設(shè)置為一次顯示全部查詢結(jié)果,操作系統(tǒng)中不額外運(yùn)行其他應(yīng)用程序,避免對(duì)系統(tǒng)資源的干擾。選用了“合成”、“網(wǎng)絡(luò)”、“鏈接”等檢索詞。
(3)查詢結(jié)果
全文檢索和模糊查詢對(duì)比測(cè)試的結(jié)果如表1所示。
表1 全文檢索與模糊查詢對(duì)比測(cè)試結(jié)果
表中:
記錄數(shù)占比=查詢結(jié)果記錄數(shù)/DT 表總記錄數(shù)(式1)
記錄數(shù)互比=全文檢索的結(jié)果記錄數(shù)/模糊查詢的結(jié)果記錄數(shù)(式2)
查詢速度互比=模糊查詢的耗時(shí)/全文檢索的耗時(shí)(式3)
耗時(shí)是查詢過(guò)程所使用的時(shí)間,以秒為單位,來(lái)自PL/SQL Developer 9.0 給出的結(jié)果。
(1)對(duì)測(cè)試數(shù)據(jù)本身的分析
測(cè)試選用JAVADOC文檔集屬于一個(gè)單一的專業(yè)領(lǐng)域,共有8964篇,占用550M左右表空間,有一定的規(guī)模,數(shù)據(jù)量對(duì)全文檢索性能分析有意義。
測(cè)試中選擇了7個(gè)檢索詞,這7個(gè)檢索詞的查詢結(jié)果的記錄數(shù)占比從0.007變化到0.975,覆蓋范圍比較廣,檢索詞選取對(duì)全文檢索分析有意義。
(2)查全能力分析
圖1 全文檢索記錄數(shù)與模糊查詢記錄數(shù)
圖2 全文檢索記錄數(shù)與模糊查詢記錄數(shù)互比
模糊是查詢能夠把滿足條件的所有數(shù)據(jù)都查詢出來(lái),而全文檢索由于可能存在分詞不正確的原因,可能有少數(shù)滿足條件的記錄查詢不到。從圖1和圖2可以看出,對(duì)相同表和相同的檢索詞,全文檢索和模糊檢索的結(jié)果基本相差很小,記錄數(shù)互比最高到0.9998856,筆者推斷,記錄數(shù)互比很高的原因是我們使用專業(yè)文獻(xiàn)作為測(cè)試數(shù)據(jù)集,并且使用專業(yè)詞匯作為檢索詞?;究梢哉J(rèn)為在專業(yè)領(lǐng)域全文檢索可以查全所有結(jié)果。
(3)查詢速度分析
圖3 模糊查詢耗時(shí)
從圖3中可以看出,無(wú)論查詢結(jié)果記錄占比為多少,模糊查詢的時(shí)間基本上是一個(gè)常數(shù),在16秒左右。反過(guò)來(lái)說(shuō)明,模糊查詢的耗時(shí)與查詢結(jié)果的數(shù)量沒(méi)有關(guān)系。這個(gè)測(cè)試結(jié)論印證了模糊查詢機(jī)制,模糊查詢要將檢索詞與所有記錄的TXT字段內(nèi)容進(jìn)行比對(duì),對(duì)同一個(gè)表每個(gè)檢索詞比對(duì)記錄數(shù)是相同的,在一篇文檔內(nèi)比對(duì)的方法也是相同的,所以每個(gè)檢索詞的查詢耗時(shí)基本相同。
圖4 全文檢索耗時(shí)
從圖4中可以看出,全文檢索的耗時(shí)隨著檢索結(jié)果的增加線性增加,這與全文索引的存儲(chǔ)機(jī)制有密切關(guān)系。如果有多篇文檔包含同一個(gè)索引詞,那么就會(huì)對(duì)這個(gè)索引詞建立起這些文檔的編號(hào)鏈表,包含同一個(gè)索引詞的文檔越多,鏈表就越長(zhǎng)。全文檢索就是找到索引詞的鏈表,并解析鏈表把文檔編號(hào)分析出來(lái)。因此當(dāng)索引詞的記錄數(shù)越多時(shí),鏈表就越長(zhǎng),耗時(shí)就越多,基本是一個(gè)線性遞增的關(guān)系。
從圖5中可以看出,查詢結(jié)果記錄數(shù)占比小于0.1時(shí),全文檢索與模糊查詢的速度互比有幾十倍甚至上百倍,全文檢索的優(yōu)勢(shì)非常明顯。當(dāng)查詢結(jié)果記錄數(shù)占比大于0.4時(shí),全文檢索與模糊查詢的速度互比小于5,最小只有2.426,全文檢索的優(yōu)勢(shì)減弱。綜合圖3和圖4可以看出,模糊查詢的耗時(shí)與查詢結(jié)果多少無(wú)關(guān),基本是一個(gè)常數(shù),而全文檢索查詢的結(jié)果記錄越多耗時(shí)越長(zhǎng),這是查詢結(jié)果越多時(shí)全文檢索優(yōu)勢(shì)迅速下降的根本原因。雖然全文檢索的優(yōu)勢(shì)已經(jīng)不是十分明顯,但是全文檢索兩倍以上的速度優(yōu)勢(shì)仍然有應(yīng)用價(jià)值。
圖5 全文檢索與模糊查詢的速度互比
[1]蒙輝,陳燕.Oracle Text技術(shù)在復(fù)雜結(jié)構(gòu)數(shù)據(jù)庫(kù)中的應(yīng)用[J].計(jì)算機(jī)技術(shù)與發(fā)展,2007,17(4):38-44.
[2]葛振國(guó),李建,何林糠等.基于Lucene的Oracle數(shù)據(jù)庫(kù)全文檢索.信息技術(shù),2010(3):156-158.
[3]楊寶峰.數(shù)據(jù)庫(kù)全文檢索技術(shù).黑龍江科學(xué)信息,2007(5)45-45.
Research on the Performance of Oracle Full Text Retrieval
GONG Jian-hua
(PLA Academy of National Defense Information,Wuhan 430010)
With more and more applications in full text retrieval,understanding of the performance of database full-text retrieval is needed.Introduces the method of setting Oracle text,and then the loads test data,tests the performance of full-text retrieval and fuzzy query,analyses the search ability and speed of the full-text retrieval in details.
Database;Full Text Retrieval;Fuzzy Query
1007-1423(2016)27-0036-04DOI:10.3969/j.issn.1007-1423.2016.27.010
龔建華(1973-),男,湖北麻城人,副教授,碩士研究生,研究方向?yàn)樾畔⑾到y(tǒng)設(shè)計(jì)與數(shù)據(jù)工程
2016-06-21
2016-09-20