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、首先双击桌面plsql developer软件启动软件,在连接窗口中填写连接信息,连接数据库。
2、连接成功后新建命令窗口,在sql查询中一般情况下对于数据比较少的表都会使用普通查询进行查询数据,如下图。
3、有的时候针对数据量比较大,而又不太确定查询目录的表在进行查询的时候,就需要进行模糊查询,使用关键字Like ,如下图查询出职工姓名第二个字符是o的职工信息。
4、种模糊查询的方式只能针对字符串类型的数据列进行查询,其它类型的数据是无法查询出结果的,如下图。
5、除了模糊查询之外还有反向模糊查询,not like,它的使用就是根据查询条件查询满足查询条件以外的数据。
语法:select * from TABLE表 where\x0d\x0adbms_lob.instr(字段名(clod类型),'查询条件',1,1) >0\x0d\x0a\x0d\x0acreate table products(\x0d\x0aproductid number(10) not null,\x0d\x0aname varchar2(255),\x0d\x0adescription CLOB)\x0d\x0a\x0d\x0a查询语句:\x0d\x0a\x0d\x0aselect t.productid, t.name from products t\x0d\x0a\x0d\x0awhere dbms_lob.instr(t.description, 'aaa', 1, 1) >0\x0d\x0a\x0d\x0a在Oracle中,可以使用instr函数对某个字符串进行判断,判断其是否含有指定的字符。其语法为:\x0d\x0ainstr(sourceString,destString,start,appearPosition).\x0d\x0a其中sourceString代表源字符串;destString代表想聪源字符串中查找的子串;start代表查找的开始位置,该参数可选的,默认为\x0d\x0a1;appearPosition代表想从源字符中查找出第几次出现的destString,该参数也是可选的,默认为1;如果start的值为负数,那\x0d\x0a么代表从右往左进行查找。\x0d\x0a返回值为:查找到的字符串的位置。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)