众所周知,使用 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模糊查询很慢,采用全文索引解决模糊查询速度慢的问题相关推荐

  1. 采用全文索引解决模糊查询速度慢的问题

    众所周知,使用 like 进行模糊查询速度极差,包括 like 'AAA%' ,like '%AAA',like '%AAA%',like '%A%A%'以及采用"_"进行单字符匹 ...

  2. 2021-06-21解决列表查询很慢的优化SQL定位查询慢原因优化

    解决问题如下 主要是耗时查询很久的问题! 1.查询定位下SQL是不是有慢查询: EXPLAIN SELECTp.id,p.news_id,parent_news_id,title,app_ids,ne ...

  3. MySQL 用全文索引解决模糊查询

    点击下方"IT牧场",选择"设为星标" 前言 我们都知道 InnoDB 在模糊查询数据时使用 "%xx" 会导致索引失效,但有时需求就是如此 ...

  4. Mysql 查询blob数据很慢,关于oracle中clob字段查询慢的问题及解决方法

    关于oracle中clob字段查询慢的问题及解决方法 最近在用oracle的过程中用到了对blob字段模糊查询的问题,对oracle来说,我并不是高手,找了很多的资料终于能够查出来了. blob字段直 ...

  5. oracle错误号大全(查询ora错误号以及解决方法技巧)

    oracle 查询ora错误号以及解决方法技巧 racle 错误号以及解决方法技巧 经常有朋友问我ORACLE 类似ora-00109 错误的信息,其实我们的ORACLE系统本身已经为我们详细的说明了 ...

  6. Oracle数据库表,数据量很少,但是查询很慢

    Oracle数据库表,数据量很少,但是查询很慢 1.起因 1.1.原因排查 1.2.原因分析 2.解决方式 2.1.删表重建这张表(95%解决一切问题) 2.2.建索引(目前用的) 1.起因 一开始是 ...

  7. SDE ST_Geometry SQL st_intersects查询很慢的解决方法

    环境:服务端 SDE 10.0 oracle 11.2,客户端 PLSQL 11,oracle 11.2 为了调试方便,以下测试都是把sql提取出来在PLSQL上做 需求是已知一个多边形的点坐标,要在 ...

  8. mysql解决模糊查询包含关系

    mysql解决模糊查询包含关系 后台要根据期限筛选查询时如果用like, SELECT * from t_user_accord_invest t where t.invest_period like ...

  9. 解决模糊查询问题 element UI 从服务器搜索数据,输入关键字进行查找

    解决模糊查询问题 element UI 从服务器搜索数据,输入关键字进行查找 参考文章: (1)解决模糊查询问题 element UI 从服务器搜索数据,输入关键字进行查找 (2)https://ww ...

最新文章

  1. ASP.NET AJAX示例程序:实现IDragSource和IDropTarget接口将商品拖放至购物车中
  2. Android Studio SDK Manager 解决无法更新问题
  3. access 分表存储_sharding:谁都能读懂的分库、分表、分区
  4. php 表单错误弹窗,PHP表单错误
  5. 10个相似图片搜索以图找图的网站
  6. 震惊!我发现了一个CSDN的文章编辑BUG,即使保存草稿也让我一天的努力白费!
  7. PHP的Static与Global
  8. Python 基础函数
  9. 硅谷公司:我们称他们为软件工程师,而非打工人
  10. Windows 对外开放端口号
  11. CentOS7中rpm,yum软件安装命令
  12. Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 1) B. Bear and Blocks 水题
  13. UNIX环境高级编程(第2版)
  14. 中国医院评审/评级标准及区别和特点
  15. html三段式布局,移动端 三段式布局 (flex方式)
  16. 湖北省仙桃市谷歌高清卫星地图下载
  17. 智能识别车道线、车辆、行人、停车标志
  18. 【JS】问题——解决JS文件页面更新不生效问题
  19. 实战篇-OpenSSL之AES加密算法-ECB模式
  20. 引用pdf插件在线预览的问题

热门文章

  1. 2 字符串求交集_PostGIS教程十八:维数扩展的9交集模型
  2. Mysql的MVCC是什么
  3. linux cordova安装教程,cordova搭建环境
  4. uboot下nand flash读写方法_鸿蒙HarmonyOS烧录方法总结
  5. 通达信公式大全_通达信MACD金叉的选股公式大全
  6. mysql 压缩的blob不能正常显示中文内容_servlet网页显示MySQL BLOB中文乱码
  7. 初学者选黑卡还是微单_3500以内的微单相机好用吗?值得初学者入手吗?
  8. python只读模式可以打印嘛_只读python属性?无法打印对象
  9. java获取net地址 本机
  10. ajax中return取不到值的问题