1. 程式人生 > >oracle模糊查詢效率可這樣提高

oracle模糊查詢效率可這樣提高

1、使用兩邊加‘%’號的查詢,oracle是不通過索引的,所以查詢效率很低。

    例如:select count(*) from lui_user_base t where t.user_name like '%cs%';

2、like '...%'和 like'%...'雖然走了索引,但是效率依然很低。

3、有人說使用如下sql,他的效率提高了10倍,但是資料量小的時候

    select count(*) from lui_user_base where rowid in (
       select rowid from lui_user_base t where t.user_name like '%cs%'
    )

我拿100w跳資料做了測試,效果一般,依然很慢,原因:

  select rowid from lui_user_base t where t.user_name like '%cs%'   這條sql執行很快,那是相當的快,

   但是放到select count(*) from lui_user_base where rowid in()裡後,效率就會變的很慢了。

4、select count(*) from lui_user_base t where instr(t.user_name,'cs')> 0

這種查詢效果很好,速度很快,推薦使用這種。因為我對oracle內部機制不是很懂,只是對結果做了一個說明。。。慚愧啊。。。。

5、有人說了用全文索引,我看了,步驟挺麻煩,但是是個不錯的方法,留著備用:

對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的辦法定期重建索引。