Oracle like '%...%' 优化
2015-06-18 11:43
246 查看
Oracle like '%...%' 优化
1。尽量不要使用 like '%%'2。对于 like '%' (不以 % 开头),Oracle可以应用 colunm上的index
3。对于 like '%…' 的 (不以 % 结尾),可以利用reverse + function index 的形式,变化成 like '%'
4.非用like'%%'不可时,使用Oracle内部函数:INSTR()解决。
建测试表和Index,注意,重点在于带reverse的function index。同时,一定要使用CBO才行
create table test_like as select object_id,object_name from dba_objects;
-------建立测试表
create index test_like__name on test_like(object_name);
------建立索引
create index test_like__name_reverse on test_like(reverse(object_name));
------建立反向索引
analyze table test_like compute statistics for table for all indexes;
------对表进行分析
都过SQLPLUS连接到数据,一定是SQLPLUS,因为下面有写命令在PLSQL的命令行中不被支持;
set autotrace trace exp
-----设定SQL跟踪
set linesize 2000
-------设定输出宽度
select * from test_like where object_name like 'AS%';
使用了索引
select * from test_like where object_name like '%S';
未使用索引
select * from test_like where reverse(object_name)like reverse('%AS');
使用了索引
4.
在大表中,进行模糊查询,一般情况下是用LIKE'%%',但是这个东西走的是全表扫描,如果在数据量非常大的情况下,效率特别慢,因此,尝试用ORACLE函数INSTR()来解决。
实验步骤如下:
首先构造一张百万行的表。
SQL> insert into emp2 select * from emp2;
1032192 rows inserted
如上所示,构造完成
接下来连续运用多个LIKE查询来模糊匹配
SQL> select * from emp2 where job like '%RE%' and ename like '%A%' and mgr like '%3%';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
Executed in 1.859 seconds
如上所示,LIKE查询一次,就走一次全表扫描,效率非常慢
同样的效果,现在来换做INSTR函数来执行
SQL> select * from emp where instr(job,'RE')>0 and instr(ename,'A')>0 and instr(mgr,'3')>0;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
Executed in 0.063 seconds
看到了吧,,时间上的差异很明显,INSTR在一瞬间执行完成,因为这个是查找的字段,而非走全表扫描
看来,oracle 内部函数效率还是高些。
因此,大家以后碰到同样的问题,除了全文检索外,这个也是个好方式
注意:
select id, name from users where instr(id, '101') > 0;
等价于
select id, name from users where id like '%101%'
相关文章推荐
- oracle 往表中插入多条数据(整理)
- Oracle常用コマンド((命令)(liunx)
- ORACLE常用命令
- oracle所有的管理命令,包括对耗时的语句的查找
- oracle中sign函数
- 【Oracle学习笔记-1】Win7下安装Oracle 10g
- oracle 体系结构详解
- Oracle错误代码大全
- oracle 数据库表的列名修改
- oracle 体系结构解析
- Oracle Policy For NBU
- 数据库事务隔离级ORACLE数据库事务隔离级别介绍
- C# Oracle分頁完整代碼
- oracle EBS grant 您不具有执行当前操作的足够权限。请与您的系统管理员联系。
- oracle T-SQL
- Oracle中Clob类型处理解析
- 码农心目中的高富帅甲骨文公司在走下坡路
- 【Oracle学习笔记-3】关于Oracle 10g中各种服务解析
- Oracle client 下载地址 这个地址太难找了所以记录下来
- oracle的in里面的 参数不能超过1000个,解决方法,拆成 in () or in()