比如下面两个sql:
1)select a, b where contains(b,'你好')>0;
2)select a, b where contains(b,'%你好%')>0;
其中b字段是clob类型而且建了索引我是数据库新手。现在担心两个问题
1)第2个sql会引起table scan么?
2)效率会比第1个下降多少(假设返回的数据数量没有太大差异)
1)select a, b where contains(b,'你好')>0;
2)select a, b where contains(b,'%你好%')>0;
其中b字段是clob类型而且建了索引我是数据库新手。现在担心两个问题
1)第2个sql会引起table scan么?
2)效率会比第1个下降多少(假设返回的数据数量没有太大差异)
select a, b where b like '%你好%' ;
如果使用半模糊匹配: '你好%' , 还有会走索引,性能差不多;
但是你如果使用完全匹配:'%你好%' 就完全不匹配了,性能就下降了很多。 这种情况也是Orale不尽完美的地方。
具体得看你要求是哪种。
像我们通常的动态SQL中或其他地方,就是用了完全匹配,得牺牲性能才成就效果。
第二个sql的%是什么含义,contains还用%通配符吗?
2)手头没有大数据量的库供测试,所以现在无法试验。
3)%在常见数据库中都可以做通配符。我担心的是 1)会不会运行时重建索引?
2)在索引上查询 '%你好%' 会比查询 '你好' 效率低多少?请指教
%%只走函数索引,第2个sql的话,除非你b字段建立了函数索引,否则是表扫描!
Oracle的CONTAINS很变态,它只会全字匹配,要想查字串只能自己加%
全文检索
http://epub.itpub.net/4/1.htm
加%%统配符,性能肯定会有所下降,但可以通过创建substring索引来提高性能,oracle文档原文解释如下:When your wildcard queries are left- and double-truncated, you can improve query performance by creating a substring index. Substring indexes improve query performance for all types of left-truncated wildcard searches such as %ed, _ing, or %benz%.
关于substring索引介绍,可参考
http://download-west.oracle.com/docs/cd/B10501_01/text.920/a96518/cdatadic.htm#34699楼主可以尝试一下