scott@ORCL> CREATE UNIQUE INDEX SCOTT.I_DEPT_DEPTNO_DNAME ON SCOTT.DEPT
2 ( DNAME);
Index created.
scott@ORCL> Analyze Table SCOTT.DEPT Compute Statistics ;
Table analyzed.
scott@ORCL> SELECT *
2 FROM scott.dept
3 WHERE rowid IN (SELECT /*+index_ffs(DEPT
I_DEPT_DEPTNO_DNAME ) rowid FROM scott.dept
5 WHERE dname LIKE '%A%');
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE (Cost=2 Card=1 Bytes=24)
1 0 NESTED LOOPS (Cost=2 Card=1 Bytes=24)
2 1 INDEX (FULL SCAN) OF 'I_DEPT_DEPTNO_DNAME' (UNIQUE) (Cost=26 Card=1 Bytes=9)
3 1 TABLE ACCESS (BY INDEX ROWID) OF 'DEPT' (Cost=1 Card=5 Bytes=75)
4 3 INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
10 consistent gets
0 physical reads
0 redo size
678 bytes sent via SQL*Net to client
425 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
4 rows processed
scott@ORCL>
实际上这样执行的前提条件就是like返回的记录很少,就可以,否则读取量可能没有全表扫描好。
2 ( DNAME);
Index created.
scott@ORCL> Analyze Table SCOTT.DEPT Compute Statistics ;
Table analyzed.
scott@ORCL> SELECT *
2 FROM scott.dept
3 WHERE rowid IN (SELECT /*+index_ffs(DEPT
I_DEPT_DEPTNO_DNAME ) rowid FROM scott.dept
5 WHERE dname LIKE '%A%');
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE (Cost=2 Card=1 Bytes=24)
1 0 NESTED LOOPS (Cost=2 Card=1 Bytes=24)
2 1 INDEX (FULL SCAN) OF 'I_DEPT_DEPTNO_DNAME' (UNIQUE) (Cost=26 Card=1 Bytes=9)
3 1 TABLE ACCESS (BY INDEX ROWID) OF 'DEPT' (Cost=1 Card=5 Bytes=75)
4 3 INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
10 consistent gets
0 physical reads
0 redo size
678 bytes sent via SQL*Net to client
425 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
4 rows processed
scott@ORCL>
实际上这样执行的前提条件就是like返回的记录很少,就可以,否则读取量可能没有全表扫描好。
最初由 eygle 发布
[B]lfree介绍的是一种方法;RudolfLu曾经也介绍过一种方法,就是根据搜索字段+rowid建立一个物理表,对这个物理表进行全表,相较ffs会更快一些,不过需要定期刷新物理表,适用于变化较少,查询要求实时性要求不高的环境。
其实也可以用Oracle的全文检索技术,可能会有更好的结果,看我以下的一个例子:
[php]
1.这是模糊查询的结果
SQL> select count(*) from jivemessage where subject like '%abc%';
COUNT(*)
----------
13
Elapsed: 00:00:15.31
2.这是全文检索的结果
SQL> select count(*) from jivemessage where contains(subject,'abc')>0;
COUNT(*)
----------
25
Elapsed: 00:00:00.03
3.模糊查询的内容
SQL> select subject from jivemessage where subject like '%abc%';
SUBJECT
--------------------------------------------------------------------------------
abc
测试发贴""abc
abc
Re: abc
Re: abc
Re: abc
初夜abc
abcd
abc
abc
SUBJECT
--------------------------------------------------------------------------------
哈哇abc
http;//baoxing.168abc.com
13 rows selected.
Elapsed: 00:00:03.29
4.也许这是我们更想要的结果
SQL> select subject from jivemessage where contains(subject,'abc')>0;
SUBJECT
--------------------------------------------------------------------------------
【游戏】 把你的名字的首字母用智能ABC打出,看能出来什么?
游戏——把你的名字首字母用智能ABC打出来
智能ABC暗藏杀机
ABC
ABC
ABC
ABC
ABC
ABC
哈哇abc
abc
SUBJECT
--------------------------------------------------------------------------------
abc
ABC
振奋爱的激情方案ABC
智能ABC的错吗?
ABC全选
瓜果美容ABC
经典英文歌曲ABC,不好你拿版砖砍我,好就回帖顶一下!
初夜abc
Re: abc
Re: abc
Re: abc
SUBJECT
--------------------------------------------------------------------------------
abc
测试发贴""abc
abc
25 rows selected.
Elapsed: 00:00:00.04
SQL>
.
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22936840/viewspace-750102/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/22936840/viewspace-750102/