`

Oracle SQL 语句中对Like的优化(引用reverse函数)

 
阅读更多

重点关注reverse

用法:reverse(字段)like reverse(属性值);

实际例子体现出得查询效率:

select Max(Ana_Rqb_Date) from Ana_Rqb where ana_rqb_org_id like '00%';

--25s

select Max(Ana_Rqb_Date) from Ana_Rqb where reverse(ana_rqb_org_id)like reverse('00%');

--1s

例1引用文章:

question:
-----------------------------------------------------------
我想请教一下:reverse key index在哪些情况下使用比较合适?谢谢。

-----------------------------------------------------------
answer1:

disk i/o很差的情况下用,如果用了raid的条带等功能,
就没有必要使用reverse key index

-----------------------------------------------------------
answer2:

索引数据分布的很不均匀的时候,
比如想在基于时间的字段上建立索引的时候,
使用reverse key可能就比较有效
因为基于时间作索引,一般数据都有高峰和低谷,在高峰和低谷时的数据量差别还比较达

-----------------------------------------------------------
answer3:

这是哪跟哪啊 reverse key index 解决的是 SGA 中的热点问题,和os怎么算在一起了

-----------------------------------------------------------
answer4:

SGA为什么会有热块呢?是因为disk i/o太差而已

当载入有序数据时,索引肯定会碰到与I/O相关的一些瓶颈,
在数据载入期间,某部分索引和磁盘定比其它部分使用频繁,
为了解决这个问题,提供了reverse key index,索引项的数据
存储与b-tree相反,结果就是索引维护时会将新行添加到不同
的块中。

-----------------------------------------------------------
answer5:

主要是解决索引树中的极不平衡的情况.

不过在重新rebuild索引后就没有那么重要了.

-----------------------------------------------------------
answer6:

需要知道如何向一树上加节点,如果值是顺序长增的,可能会造成上述图中左边的情况
这时要通过检索一个值时,就会很慢.在插入是往一边插入,所以在索引上有很多的HOT BLOCK

例2:

简单说两句Like的优化

  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)

from:http://hi.baidu.com/zting0103/blog/item/8d9b2def55baea15fcfa3c67.html

分享到:
评论

相关推荐

    利用reverse索引优化like语句的方法详解

    主要介绍了关于利用reverse索引优化like语句的方法,文中通过图文介绍的很详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。

    js中reverse函数的用法详解

    本篇文章主要是对js中reverse函数的用法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助

    DB2中REVERSE函数的实现方法

    有哥们在群里问DB2有没有自带的reverse函数,我测试一下,DB2确实内置该函数,但是oracle,sql server都内置了该函数,来看一下

    SQL函数

    系统函数 suser_name() 用户登录名 user_name() 用户在数据库中的名字 user 用户在数据库中的名字 show_role() 对当前用户起作用的规则 db_name() 数据库名 object_name(obj_id) 数据库对象名 ...

    SQL Server 2014基础入门视频教程 (40集,含课件)

    SQL Server 2014基础入门视频教程 (40集,含课件) 1.SQL Server 2014简介.mp4 2.SQL Server 2014... 38.SQL Server 2014 REVERSE函数.mp4 39.SQL Server 2014 CAST函数.mp4 40.SQL Server 2014 CASE函数.mp4

    SQL 2008数据库移植到oracle 11g

    首先需要PowerDesigner连接到SQLSERVER2008,把对应的数据库REVERSE ENGINEER到PD,

    40集SQL Server 基础入门视频教程 SQL Server 数据库基础入门必备课程.txt

    38.SQL Server 2014 REVERSE函数.mp4 39.SQL Server 2014 CAST函数.mp4 4.SQL Server 2014数据库创建.mp4 40.SQL Server 2014 CASE函数.mp4 5.SQL Server 2014数据库修改与删除.mp4 6.SQL Server 2014数据库...

    40集SQL Server 基础入门视频教程 SQL Server 数据库基础入门必备课程

    38.SQL Server 2014 REVERSE函数.mp4 39.SQL Server 2014 CAST函数.mp4 4.SQL Server 2014数据库创建.mp4 40.SQL Server 2014 CASE函数.mp4 5.SQL Server 2014数据库修改与删除.mp4 6.SQL Server 2014数据库...

    sqlserver数据库常用函数

    1.DATEADD 2 2.DATEDIFF 4 3.DATENAME 5 4.DATEPART 7 5.DAY 9 6.GETDATE 10 7.GETUTCDATE 11 8.MONTH 11 ...14.REVERSE 56 15.RIGHT 57 16.RTRIM 59 17.SOUNDEX 60 18.SPACE 61 19.STR 62 20.STUFF 65

    hive函数大全(中文版)

    2. 字符串反转函数:reverse 23 3. 字符串连接函数:concat 23 4. 带分隔符字符串连接函数:concat_ws 23 5. 字符串截取函数:substr,substring 24 6. 字符串截取函数:substr,substring 24 7. 字符串转大写函数:...

    SQL Server中通过reverse取某个最后一次出现的符号后面的内容(字符串反转)

    sql语句 代码如下:reverse(substring(reverse(Path),1,charindex(‘/’,reverse(Path)) – 1)) SQL如何取出一个字符串中最后一个特殊字符右边的字符,例如:10*20*300,怎样得到300?使用reverse配合charindex来实现...

    PL/SQL 基础.doc

    3) Oracle对SQL的扩充; 4. PL/SQL的优缺点 优点:1) 结构化模块化编程,不是面向对象; 2) 良好的可移植性(不管Oracle运行在何种操作系统); 3) 良好的可维护性(编译通过后存储在数据库里); 4) 提升系统性能...

    void reverse(char *source)实现字符串逆序,递归法

    从键盘输入字符串,用函数void reverse(char *source)通过递归法实现字符串逆序.

    python的reverse函数翻转结果为None的问题

    reverse函数,翻转列表 然后我改了一下 >>> L2.reverse() >>> L3=L2 >>> print(L3) [4, 3, 2, 1] >>> print(L2) [4, 3, 2, 1] >>> 这是在网上找到的解释 a=[1,2,3,4].reverse() – why “a” is Non

    Perl 实例精解(第三版).pdf

    4.4.14 reverse函数 4.4.15 unshift函数 4.5 散列(关联数组)函数 4.5.1 keys函数 4.5.2 values函数 4.5.3 each函数 4.5.4 delete函数 4.5.5 exists函数 4.6 关于散列的更多内容 4.6.1 从...

    pb函数大集合

    数值计算函数 FileOPen() Reverse() Abs() 日期、时间函数 FileRead() ToAnsi() Ceiling() Day() FileSeek() ToUnicode() Cos() DayName() FileWrite() Exp() DayNumber() GetFileOpenName() 其他函数 ...

    Sql Server基本函数

    1.字符串函数 长度与分析用 datalength(Char_expr) 返回字符串包含字符数,但不包含后面的空格 substring(expression,start,length) 不多说了,取子串 right(char_expr,int_expr) 返回字符串右边int_expr个字符...

    reverse c++

    reverse c++

    Oracle事例

    字符串字段中含有\"\'\",如果用来组合sql语句,会造成语句不准确。 比如:replace(f1,\'\'\'\',\'\') <2>.字符串字段中含有\"\\t \\n\",如果用来在c或者c++程序中输出到文件,格式无法保证。 比如:replace(f2,...

Global site tag (gtag.js) - Google Analytics