oracle模糊查询效率提高

分2种思路考虑模糊查询的效率的提高。--注:专注处理百万级数据量,小量数据就算了

第一种:把数据存到业务内存中,通过查询内存提高效率。(要求:硬件内存要高)

1,如果想实现内存动态数据,可以监控表数据变化更新内存。

 

第二种:提高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、有人说了用全文索引,我看了,步骤挺麻烦,但是是个不错的方法,留着备用:

http://sandish.itpub.net/post/4899/464369

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

 

参考资料:
1,http://blog.csdn.net/yurenjia/archive/2007/04/08/1556306.aspx
2,http://topic.csdn.net/u/20080117/23/34004f4a-4989-47ef-8764-0b7e3bf737a7.html
3,http://tenwe.com/tech/database/oracle/200702/content_561_4.shtml
4,http://www.knowsky.com/389357.html
5,http://yangtingkun.itpub.net/post/468/195520
6,http://bbs.zdnet.com.cn/archiver/tid-120474.html
7,http://bbs.51cto.com/archiver/tid-26270.html
8,http://oracle.chinaitlab.com/exploiture/720104_3.html
9,http://www.33kuai.cn/html/shujuku/20080126/5314_2.html
10,http://www.xrss.cn/Dev/DataBase/20084218963.Html

 
 
 
 
 
Oracle模糊查询优化(亲测有效)三千万数据量0.1秒实现模糊查询 找了两天提升模糊查询效率的方法,总算是解决了, 可以看到表数据量是三千多万, 如果用like模糊查询用时28秒 有一种说法是用instr代替like,这样效率会快一点 可以看到instr在我这儿效果也不是非常理想 用like是走不了索引的,instr是要带变量的函数,也不知道怎么建函数索引 后来建了全文索引,用CONTAINS查,就稍微提升了一点点效率 可以看到现在用时0.1秒,效果应该算是比较理想了 ... 阅读详情

相关推荐

【随机过程】第二章——随机过程概论

随机过程概论,说明《随机过程》课程的教学大纲,对随机过程概念、研究对象和研究方法做了简要介绍。

weixin_45225032的博客 1340

oracle性能优化-模糊查询

oracle数据库数据量非常大时,使用双%的模糊查询效率会变得比较慢,因为双%的模糊查询并没有使用索引,而是用的全表扫描。而单%则使用了索引进行检索。以下是几种检索方式的效率对比,表中有800万条数据。1.使用正则表达式进行检索2.使用双%进行模糊查询3.使用单%进行模糊查询4.使用=号进行精准查询以上4种查询都获得同样的查询结果,如下10条记录:========================...

duduhonghong的博客 6633

TwinCAT3 Modbus-TCP Client/Server使用

/起始地址是12289//起始地址是12294。

panjinliang066333的博客 7669

记一次oracle大量数据模糊查询效率问题

今天在维护程序的时候发现有一个模糊查询效率特别低,三百万数据大约得四五十秒,原sql大致如下: select * from datalog a where a.requestdata like '%121100101%'; 后来看了下逻辑,大致意思就是必须使用模糊查询来匹配,遂改用以下sql来执行: select * from datalog t where instr(t.requestdata,'121100101')> 0; 改之前得四五十秒,改完之后七八秒即可查询出结果。

心寒的博客 1万+

关于ORACLE中使用LIKE进行多字段模糊匹配的一种解决思路

关于ORACLE中使用LIKE进行多字段模糊匹配的一种解决思路

liucm123的专栏 2万+

oracle中比like'%'更高效的模糊查询方法

这里记录一下一个比较好的模糊查询方法。转载自Oracle模糊查询方法。 在Oracle中提供了instr(strSource,strTarget)函数,比使用'%关键字%'的模式效率高很多。 instr函数有三种情况: instr(字段, '关键字')>0相当于字段like '%关键字%' instr(字段, '关键字')=1相当于字段like '关键字%' instr...

渴望飞的鱼的博客 3805

oracle模糊查询导致cpu高,oracle模糊查询效率提高

分2种思路考虑模糊查询的效率提高。--注:专注处理百万级数据量,小量数据就算了第一种:把数据存到业务内存中,通过查询内存提高效率。(要求:硬件内存要高)1,如果想实现内存动态数据,可以监控表数据变化更新内存。第二种:提高oracle数据库的查询方式。1、使用两边加‘%’号的查询,oracle是不通过索引的,所以查询效率很低。例如:select count(*) from lui_user_bas...

weixin_42109178的博客 568

使用Oracle的instr函数与索引配合提高模糊查询的效率

使用Oracle的instr函数与索引配合提高模糊查询的效率 一般来说,在Oracle数据库中,我们对tb表的name字段进行模糊查询会采用下面两种方式:1.select * from tb where name like '%XX%';2.select * from tb where instr(name,'XX')>0;若是在name字段上没有加索引,两者效率差不多,基本没有区别。为提...

weixin_30699465的博客 2204

oracle模糊查询效率可这样提高

1、使用两边加‘%’号的查询,oracle是不通过索引的,所以查询效率很低。 例如:select count(*) from lui_user_base t where t.user_name like '%cs%'; 2、like '...%'和 like'%...'虽然走了索引,但是效率依然很低。 3、有人说使用如下sql,他的效率提高了10倍,...

dazigeng4522的博客 260

Oracle模糊查询之(3.1从使用函数和sql语法角度来提高模糊查询效率 一)oracle模糊查询效率提高

oracle模糊查询效率提高 博客分类:  oracle 数据库 模糊查询 内存 技术札记   分2种思路考虑模糊查询的效率提高。--注:专注处理百万级数据量,小量数据就算了 第一种:把数据存到业务内存中,通过查询内存提高效率。(要求:硬件内存要高) 1,如果想实现内存动态数据,可以监控表数据变化更新内存。   第二种:提高oracle数据库

haiross的专栏 2578

Oracle模糊查询之(3.3从使用函数和sql语法角度来提高模糊查询效率 三)使用Oracle的instr函数与索引配合提高模糊查询的效率

使用Oracle的instr函数与索引配合提高模糊查询的效率 一般来说,在Oracle数据库中,我们对tb表的name字段进行模糊查询会采用下面两种方式: 1.select * from tb where name like '%XX%'; 2.select * from tb where instr(name,'XX')>0; 若是在name字段上没有加索引,两者效率差不多,基本没有

haiross的专栏 2564

【转】oracle模糊查询效率提高

1、使用两边加‘%’号的查询,oracle是不通过索引的,所以查询效率很低。     例如:select count(*) from lui_user_base t where t.user_name like '%cs%'; 2、like '...%'和 like'%...'虽然走了索引,但是效率依然很低。 3、有人说使用如下sql,他的效率提高了10倍,但是数据量小的时候

大厨的专栏 327

Oracle模糊查询之(3.2从使用函数和sql语法角度来提高模糊查询效率 二)ORACLE中Like与Instr模糊查询性能大比拼

ORACLE中Like与Instr模糊查询性能大比拼 ORACLE中Like与Instr模糊查询性能大比拼     instr(title,'手册')>0  相当于  title like '%手册%'   instr(title,'手册')=1  相当于  title like '手册%'   instr(title,'手册')=0  相当于  title not l

haiross的专栏 5628

Oracle模糊查询之(3.2从使用函数和sql语法角度来提高模糊查询效率 二)ORACLE中Like与Instr模糊查询性能大比拼 ...

源:http://blog.csdn.net/haiross/article/details/12974851 评: ORACLE中Like与Instr模糊查询性能大比拼 ORACLE中Like与Instr模糊查询性能大比拼 instr(title,'手册')>0 相当于 title like '%手册%' instr(title,'手册...

mauersu 222

ORACLE中Like与Instr模糊查询性能大比拼

ORACLE中Like与Instr模糊查询性能大比拼     instr(title,'手册')>0  相当于  title like '%手册%'   instr(title,'手册')=1  相当于  title like '手册%'   instr(title,'手册')=0  相当于  title not like '%手册%'   t表中将近有1100万数据,很...

iteye_16982的博客 887

oracle中like和in的效率,Oracle中Like与Instr模糊查询性能大比拼

instr(title,'手册')>0 相当于 title like '%手册%'instr(title,'手册')=1 相当于 title like '手册%'instr(title,'手册')=0 相当于 title not like '%手册%'t表中将近有1100万数据,很多时候,我们要进行字符串匹配,在SQL语句中,我们通常使用like来达到我们搜索的目标。但经过实际测试发现,li...

weixin_39662462的博客 1649
上一篇: log4j的基本使用方法
下一篇: 使用json-lib进行Java和JSON之间的转换
iteye_514
博客等级 码龄8年 3粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值