重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
1、使用两边加‘%’号的查询,Oracle是不通过索引的,所以查询效率很低。
成都创新互联,为您提供成都网站建设、成都网站制作、网站营销推广、网站开发设计,对服务成都软装设计等多个行业拥有丰富的网站建设及推广经验。成都创新互联网站建设公司成立于2013年,提供专业网站制作报价服务,我们深知市场的竞争激烈,认真对待每位客户,为客户提供赏心悦目的作品。 与客户共同发展进步,是我们永远的责任!
例如: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的办法定期重建索引。
建议使用全文检索(FULL TEXT SEARCH)。
用ORACLE8i中的intermedia text或者oracle9i的text对CLOB字段建一个CTXSYS.CONTEXT 类型的索引, 然后在查询时用CONTAIN作为查询条件.代码如下:--创建表CREATE TABLE tb_clob(
userid NUMBER PRIMARY KEY,
text CLOB);--建立索引CREATE INDEX search_idx
ON tb_clob(text)
INDEXTYPE IS ctxsys.CONTEXT;--查询SELECT COUNT(*)
语法: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返回值为:查找到的字符串的位置。
工具/材料:Management Studio。
1、首先在桌面上,双击打开“Management Studio”。
2、之后在Management Studio中,点击左上角“新建查询”选项。
3、接着在Management Studio中,输入的sql语句“select * from test1 where longtype LIKE '%20%' ”。
4、然后在Management Studio中,点击左上方“执行”按钮。
5、最后在Management Studio中,显示对LONG类型字段的模糊查询成功。
1、首先双击桌面plsql developer软件启动软件,在连接窗口中填写连接信息,连接数据库。
2、连接成功后新建命令窗口,在sql查询中一般情况下对于数据比较少的表都会使用普通查询进行查询数据,如下图。
3、有的时候针对数据量比较大,而又不太确定查询目录的表在进行查询的时候,就需要进行模糊查询,使用关键字Like ,如下图查询出职工姓名第二个字符是o的职工信息。
4、种模糊查询的方式只能针对字符串类型的数据列进行查询,其它类型的数据是无法查询出结果的,如下图。
5、除了模糊查询之外还有反向模糊查询,not like,它的使用就是根据查询条件查询满足查询条件以外的数据。