日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle模糊查询很慢,采用全文索引解决模糊查询速度慢的问题

發布時間:2025/3/12 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle模糊查询很慢,采用全文索引解决模糊查询速度慢的问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

眾所周知,使用 like 進行模糊查詢速度極差,包括 like 'AAA%' ,like '%AAA',like '%AAA%',like '%A%A%'以及采用“_”進行單字符匹配的那些模糊查詢。網上有很多文章講到如何提高like查詢,提到 like 'AAA%'能夠使用到索引,而like '%AAA' ,使用創建反向函數的索引來提高查詢效率。但一般情況下,是無法約定客戶端采用哪種like查詢,難道說把所有的這些情況都進行if判斷嗎?

為這個事情腦袋疼了無數次。最近,一客戶“無理”要求對用戶地址模糊查詢速度太慢。在數十萬的用戶記錄下查詢,要求5秒之內必須查詢到記錄。

想破腦袋還是找不到方法。有同事找了本Lucene的書給我看,說是能解決。翻來覆去的看了2,3遍,始終想不出這玩意兒怎么用。

突然想到oracle也有全文索引一說,以前只是別人提起過這個詞。與網上朋友一聊,說是似乎可以解決,但他忘了怎么用了。

半夜12點,趕緊爬起來,到google上查資料。還真有兩下子,研究了幾個小時,有所獲。第二天白天沒時間研究,晚上繼續,最終把全文索引搞定,解決了模糊查詢速度慢的問題,在數十萬條用戶數據中, 對用戶地址進行模糊查詢速度在2秒以內就能夠查到。

-------------------------------------------------------------------------

以下是創建全文索引的方法(網上有文章提到使用圖形化界面,我用圖形化界面創建全文索引,創建了一個晚上,第二天起床居然還沒完。但用SQL命令15分鐘左右就搞定):

對cmng_custominfo 表中的address字段做全文檢索:

1,在oracle9201中需要創建一個分詞的東西:

BEGIN

ctx_ddl.create_preference ('SMS_ADDRESS_LEXER', 'CHINESE_LEXER');

--ctx_ddl.create_preference ('my_lexer', 'chinese_vgram_lexer'); 不用

end;

2,創建全文檢索:

CREATE INDEX INX_CUSTOMINFO_ADDR_DOCS ON cmng_custominfo(address) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS ('LEXER SMS_ADDRESS_LEXER');

3,查詢時候,使用:

select * from cmng_custominfo where contains (address, '金色新城')>1;

4,需要定期進行同步和優化:

同步:根據新增記錄的文本內容更新全文搜索的索引。

begin

ctx_ddl.sync_index('INX_CUSTOMINFO_ADDR_DOCS');

end;

優化:根據被刪除記錄清除全文搜索索引中的垃圾

begin

ctx_ddl.optimize_index('INX_CUSTOMINFO_ADDR_DOCS', 'FAST');

end;

5,采用job做步驟4中的工作:

1)該功能需要利用oracle的JOB功能來完成

因為oracle9I默認不啟用JOB功能,所以首先需要增加ORACLE數據庫實例的JOB配置參數:

job_queue_processes=5

重新啟動oracle數據庫服務和listener服務。

2)同步 和 優化

--同步 sync:

variable jobno number;

BEGIN

DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.sync_index(''INX_CUSTOMINFO_ADDR_DOCS'');', SYSDATE, 'SYSDATE + (1/24/4)');

commit;

END;

--優化

variable jobno number;

begin

DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.optimize_index(''INX_CUSTOMINFO_ADDR_DOCS'',''FULL'');', SYSDATE, 'SYSDATE + 1');

commit;

END;

其中, 第一個job的SYSDATE + (1/24/4)是指每隔15分鐘同步一次,第二個job的SYSDATE + 1是每隔1天做一次全優化。具體的時間間隔,可以根據應用的需要而定

6,索引重建

重建索引會刪除原來的索引,重新生成索引,需要較長的時間。

重建索引語法如下:

ALTER INDEX INX_CUSTOMINFO_ADDR_DOCS REBUILD;

據網上一些用家的體會,oracle重建索引的速度也是比較快的,有一用家這樣描述:

Oracle 的全文檢索建立和維護索引要比ms sql server都要快得多,筆者的65萬記錄的一個表建立索引只需要20分鐘,同步一次只需要1分鐘。

因此,也可以考慮用job的辦法定期重建索引。

[@more@]

總結

以上是生活随笔為你收集整理的oracle模糊查询很慢,采用全文索引解决模糊查询速度慢的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。