newhappy的专栏

高级系统分析师,专注于对SOA,Ajax以及J2EE架构的研究,欢迎大家与我交流.Email:pleasechess@126.com

用户操作
[即时聊天] [发私信] [加为好友]
牛海彬ID:newhappy2008
489696次访问,排名93好友62人,关注者70
吉林大学软件工程硕士;一汽启明CPDM项目组软件工程师;
newhappy2008的文章
原创 187 篇
翻译 24 篇
转载 99 篇
评论 295 篇
newhappy的公告
非常感谢CSDN提供了这么好的一个平台,过去的一年为生活而忙忙碌碌,博客更新的不多,在新的一年里,我会勤快一点,多学一些技术,多交一些技术上的朋友.
最近评论
bingg:呵呵,任何事情都是发展的,变化的,楼主喜欢给事物下定义是不对的.鄙视一下
bingg:呵呵,任何事情都是发展的,变化的,楼主喜欢给事物下定义是不对的.鄙视一下
bjthemost:没什么没有人关心 Berkeley DB?
sz_haitao:上面这么多人重复发帖,看来本blog系统发完回复没有及时显示的bug是普遍存在的啊
VistaKobe:看完了,但不怎么样。数据库是很贵的!
文章分类
收藏
    相册
    友情连接
    114社区
    SOA-中间件
    张孝祥(RSS)
    杨洪波(RSS)
    沈东良
    许式伟(RSS)
    谭振林(RSS)
    银狐999(RSS)
    阿蒙专栏(RSS)
    存档
    订阅我的博客
    XML聚合  FeedSky

    转载 oracle中like的优化收藏

    新一篇: 在sqlplus里用show parameter 直接显示oracle隐含参数  | 旧一篇: JavaScript中的判定

    简单说两句,具体看例子


    1。尽量不要使用 like '%..%'

    2。对于 like '..%..' (不以 % 开头),Oracle可以应用 colunm上的index

    3。对于 like '%...' 的 (不以 % 结尾),可以利用reverse + function index 的形式,变化成 like '..%'


    代码:


    -- '建测试表和Index,注意,重点在于带reverse的function index。同时,一定要使用CBO才行……

     

    sys@mescp> select reverse('123') from dual;REVERSE('123')

    --------------------------------

    321

     

    1 row selected.

    sys@mescp> create table test_like as select object_id,object_name from dba_objects;

    Table created.

    sys@mescp> create index test_like__name on test_like(object_name);

    Index created.

    sys@mescp> create index test_like__name_reverse on test_like(reverse(object_name));

    Index created.
    sys@mescp> analyze table test_like compute statistics for table for all indexes;

    Table analyzed.

    sys@mescp> set autotrace trace exp

     

     


    -- '常量开头的like , 会利用index ,没问题…… '

    sys@mescp> select * from test_like where object_name like AS%';


    Execution Plan

    ----------------------------------------------------------

    0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=655 Bytes=15720)

    1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST_LIKE' (Cost=2 Card=655Bytes=15720)

    2 1 INDEX (RANGE SCAN) OF 'TEST_LIKE__NAME' (NON-UNIQUE) (Cost=2 Card=118)


    --'开头和结尾都是 % ,对不起,很难优化'

    sys@mescp> select * from test_like where object_name like '%%';


    Execution Plan

    ----------------------------------------------------------

    0 SELECT STATEMENT Optimizer=CHOOSE (Cost=6 Card=655 Bytes=15720)

    1 0 TABLE ACCESS (FULL) OF 'TEST_LIKE' (Cost=6 Card=655 ytes=15720)


    -- '以常量结束,直接写的时候是不能应用index的'

    sys@mescp> select * from test_like where object_name like '%S';

    Execution Plan

    ----------------------------------------------------------

    0 SELECT STATEMENT Optimizer=CHOOSE (Cost=6 Card=655 Bytes=15720)

    1 0 TABLE ACCESS (FULL) OF 'TEST_LIKE' (Cost=6 Card=655 Bytes=15720)

    --'以常量结束的,加个reverse 函数,又可以用上index了'

    sys@mescp> select * from test_like where reverse(object_name)like reverse('%AS');

    Execution Plan

    ----------------------------------------------------------

    0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=655 Bytes=15720)

    1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST_LIKE' (Cost=2 Card=655 Bytes=15720)

    2 1 INDEX (RANGE SCAN) OF 'TEST_LIKE__NAME_REVERSE' (NON-UNIQUE) (Cost=2 Card=118)

     

    原文:http://rollingpig.itpub.net/post/81/229801 

    发表于 @ 2008年03月21日 20:55:00|评论(loading...)|收藏

    新一篇: 在sqlplus里用show parameter 直接显示oracle隐含参数  | 旧一篇: JavaScript中的判定

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © newhappy