zoukankan      html  css  js  c++  java
  • SQL中like语句的索引使用

    • 1、尽量不要使用 like '%..%'
    • 2、对于 like '..%..' (不以 % 开头),Oracle可以应用 colunm上的index
    • 3、对于 like '%...' 的 (不以 % 结尾),可以利用 reverse + function index 的形式,变化成 like '..%' 代码




    建测试表和Index。

    注意:重点在于带reverse的function index。同时,一定要使用CBO才行......



    SQL> select reverse('123') from dual;

    REVERSE('123')

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

    321

    1 row selected.



    SQL> create table test_like as select object_id,object_name from dba_objects;

    Table created.



    SQL> create index test_like__name on test_like(object_name);

    Index created.



    SQL> create index test_like__name_reverse on test_like(reverse(object_name));

    Index created.



    SQL> analyze table test_like compute statistics for table for all indexes;

    Table analyzed.



    SQL> set autot trace



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

    SQL> 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)



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



    SQL> 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的

    SQL> 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了'

    SQL> 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)
  • 相关阅读:
    POJ 1795 DNA Laboratory
    CodeForces 303B Rectangle Puzzle II
    HDU 2197 本源串
    HDU 5965 扫雷
    POJ 3099 Go Go Gorelians
    CodeForces 762D Maximum path
    CodeForces 731C Socks
    HDU 1231 最大连续子序列
    HDU 5650 so easy
    大话接口隐私与安全 转载
  • 原文地址:https://www.cnblogs.com/anuoruibo/p/2937139.html
Copyright © 2011-2022 走看看