12
返回列表 发新帖
楼主: foreverlee

我的 like '%VALUE%' 走了索引

[复制链接]
论坛徽章:
168
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-01-04 11:49:54蜘蛛蛋
日期:2011-12-05 16:08:56ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41设计板块每日发贴之星
日期:2011-07-22 01:01:02ITPUB官方微博粉丝徽章
日期:2011-06-30 12:30:16管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:33
11#
发表于 2005-1-12 14:25 | 只看该作者

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
12#
发表于 2005-1-12 14:30 | 只看该作者
INDEX  fast  full  scan 和  index  range  scan 根本就是不同的概念,你需要先把原理弄清楚再来看表象

index  range scan 是 根据叶子节点的顺序去寻找数据,数据出来和索引顺序是一致的排好顺序的,一次读一个索引block和一个数据block

index  fast  full  scan 是根据索引 segment 的 extent 去搜索的,这个跟 FTS 的原理类似,不过 table  segment 换成了 index  segment ,一次读可以是连续的多个 index  block ,这样出来的数据顺序和 索引顺序并不一致。

而我们通常说的利用不上索引 指的 是 index  range scan  or   other  index  scan ,不是  index  fast  full scan  。
index  fast  full  scan 的前提是,数据肯定在索引中有(比如not null 的字段,或者复合索引,bitmap索引等),然后 索引 segment比表 segment小,通过索引segment 能得到所需要数据,而不用去读 任何表的block,这样 IO 将减少。

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2006-04-18 13:25:09生肖徽章2007版:猴
日期:2009-02-04 17:50:05ITPUB学员
日期:2011-08-03 10:55:36
13#
 楼主| 发表于 2005-1-12 14:33 | 只看该作者
多谢楼上两位

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
66
ITPUB元老
日期:2005-07-16 18:49:11授权会员
日期:2005-10-30 17:05:33ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44现任管理团队成员
日期:2011-05-07 01:45:08版主3段
日期:2012-05-15 15:24:11
14#
发表于 2005-1-12 14:53 | 只看该作者
最初由 foreverlee 发布
[B]

偷偷问一句: 我听人说 where column like '%%'这种查询方式会导致索引失效。
可是我的实验证明索引不会失效. [/B]


晕,无论如何,index range都比index full scan或fast index full scan要快。

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
15#
发表于 2005-1-12 15:21 | 只看该作者
最初由 xzh2000 发布
[B]

晕,无论如何,index range都比fast index full scan要快。 [/B]


这个…… 你这等于是说 麻雀肯定比鲤鱼游泳要快

不同行为方式和不同目标的两个东西能这么比较吗?

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
66
ITPUB元老
日期:2005-07-16 18:49:11授权会员
日期:2005-10-30 17:05:33ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44现任管理团队成员
日期:2011-05-07 01:45:08版主3段
日期:2012-05-15 15:24:11
16#
发表于 2005-1-12 15:27 | 只看该作者
最初由 biti_rainy 发布
[B]

这个…… 你这等于是说 麻雀肯定比鲤鱼游泳要快

不同行为方式和不同目标的两个东西能这么比较吗? [/B]


select count(*) from .... where object_name like '%xxxxx%';
select count(*) from .... where object_name like 'xxxxx%';

可楼主确实是这样问过的,range index与fast full index scan谁快?
假如返回的结果是相同的,
一个是fast full index scan,一个是index range,由于可以执行fast full index scan,那在index range 中,这个SQL也可以不用访问表而可以直接得到结果,没有跑题吧。


使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
17#
发表于 2005-1-12 15:38 | 只看该作者
最初由 xzh2000 发布
[B]

select count(*) from .... where object_name like '%xxxxx%';
select count(*) from .... where object_name like 'xxxxx%';

可楼主确实是这样问过的,range index与fast full index scan谁快?
假如返回的结果是相同的,
一个是fast full index scan,一个是index range,由于可以执行fast full index scan,那在index range 中,这个SQL也可以不用访问表而可以直接得到结果,没有跑题吧。


[/B]



两个 like 的差异明显这么大,这种问发,是因为问问题的人不明白,你拿他的 特定情况 下一个  扩大化的的结论
在非常有限条件下成立的东西,放到其他条件下就是错误的结论

若有人引用你的话,不就被你害了?

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2006-04-18 13:25:09生肖徽章2007版:猴
日期:2009-02-04 17:50:05ITPUB学员
日期:2011-08-03 10:55:36
18#
 楼主| 发表于 2005-1-12 17:32 | 只看该作者
关于Oracle - Optimising the pattern matching (LIKE '%ABC')
Tom做的回答

http://asktom.oracle.com/pls/ask ... TERIA:5968495479087


没看过的同志还是看看吧

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
19#
发表于 2005-1-12 18:03 | 只看该作者
(LIKE '%ABC')

这是另外一回事,可通过 反向索引来实现

现实就那么几种可能,实际上 index  fast  full  scan 的作用不过相当于是做过小表记录 该字段+rowid 。

也有人对于 like  '%abc%  的处理使用小表来记录
如果恒定的通过某些值来查询的,可以考虑函数索引

如果比较复杂的,还有  oracle  文本索引 也是一种解决方案。


无非都是  利用空间 来换时间,减少不必要的IO。


不论是TOM还是谁来优化,无非都是这几类方案:

在插入的时候增加代价 cpu 和存储 (索引、函数索引(反向索引)、小表)

oracle  text ,定期分析数据的话有延迟,也是利用存储来换时间

所以对于优化如果能站在一个更高一些的角度,编程无非就是在空间和时间之间寻找平衡,当时间要求优先的时候,就看怎么利用空间来替代,从这个角度入手,具体的方法结合oracle的各种特性逐一应用就是了。当然,了解数据库各种特征和功能,是基础。

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2006-04-18 13:25:09生肖徽章2007版:猴
日期:2009-02-04 17:50:05ITPUB学员
日期:2011-08-03 10:55:36
20#
 楼主| 发表于 2005-1-12 19:43 | 只看该作者
最初由 biti_rainy 发布
[B](LIKE '%ABC')

这是另外一回事,可通过 反向索引来实现

现实就那么几种可能,实际上 index  fast  full  scan 的作用不过相当于是做过小表记录 该字段+rowid 。

也有人对于 like  '%abc%  的处理使用小表来记录
如果恒定的通过某些值来查询的,可以考虑函数索引

如果比较复杂的,还有  oracle  文本索引 也是一种解决方案。


无非都是  利用空间 来换时间,减少不必要的IO。


不论是TOM还是谁来优化,无非都是这几类方案:

在插入的时候增加代价 cpu 和存储 (索引、函数索引(反向索引)、小表)

oracle  text ,定期分析数据的话有延迟,也是利用存储来换时间

所以对于优化如果能站在一个更高一些的角度,编程无非就是在空间和时间之间寻找平衡,当时间要求优先的时候,就看怎么利用空间来替代,从这个角度入手,具体的方法结合oracle的各种特性逐一应用就是了。当然,了解数据库各种特征和功能,是基础。 [/B]


很中肯的建议。谢谢

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表