银行

多列索引的疑问

由于数据库在生产环境,不方便贴信息,描述下

有个表,大概10个字段,其中有两个字段eventid和sign,eventid是int型,sign是varchar(256)

做了个索引(sign,eventid)

按照如下语句搜索
1. db2 "select * from **** where eventid=51000 and sign like 'ENT%' "
然后发现走了索引,大概是ixscan->sort->ridscan->fetch

这里有第一个问题,为什么ixscan后,要做sort?我并没有排序啊

然后使用第二个语句:
2. db2 "select * from **** where eventid=51000 and sign like '%ENT%' "
也走了索引,大概是ixscan->fetch,没有排序,但是cost是上面一种情况的3倍

按原来的理解,like后面是%开头的,是不会走索引的。且多列索引,如果where条件中的列不在多列索引的开头列,就不会走这个多列索引。 那现在是什么情况?是不是我的理解有误?
参与6

4同行回答

mdkiimdkii软件开发工程师bocn
执行计划里的ixscan容易让人产生混淆。ixscan有两种方式,一种是从root node到leaf node。一种是scan 整个leaf node(leaf 层是一个双向链表)。如果是第一种方式 你一般会在 执行计划的描述里看到 start key ,stop key,如果是第二种你会看到 sargable predicate的字样。所以像...显示全部
执行计划里的ixscan容易让人产生混淆。ixscan有两种方式,一种是从root node到leaf node。一种是scan 整个leaf node(leaf 层是一个双向链表)。如果是第一种方式 你一般会在 执行计划的描述里看到 start key ,stop key,如果是第二种你会看到 sargable predicate的字样。所以像sign like '%ENT%'这种方式,如果DB2愿意,仍然可以按第二种方式走索引(因为索引比表小)。
从你的两个SQL来看,把索引的两个字段调换一下会更好。收起
银行 · 2013-08-14
浏览765
dongxincundongxincun软件开发工程师YTEC
学习了显示全部
学习了收起
互联网服务 · 2013-08-15
浏览710
jimmyjimmy数据仓库工程师招行软件中心
首先索引扫描不是因为判断sign like 'ENT%' ,而是把索引全部取出来,排序,然后通过eventid=51000定为某些索引的行,然后再通过sign like 'ENT%' 定位rowid,最后去取数据显示全部
首先索引扫描不是因为判断sign like 'ENT%' ,而是把索引全部取出来,排序,然后通过eventid=51000定为某些索引的行,然后再通过sign like 'ENT%' 定位rowid,最后去取数据收起
银行 · 2013-08-15
浏览734
ysgiftysgift数据库管理员招商银行
这里有个很不错的帖子,可以解释第一个问题http://www.itpub.net/forum.php?m ... intable&tid=1300250简单来说就是将rid做scan,方便预取page显示全部
这里有个很不错的帖子,可以解释第一个问题
http://www.itpub.net/forum.php?m ... intable&tid=1300250

简单来说就是将rid做scan,方便预取page收起
银行 · 2013-08-14
浏览768

提问者

ysgift
数据库管理员招商银行
擅长领域: 系统运维智能化运维

问题状态

  • 发布时间:2013-08-14
  • 关注会员:1 人
  • 问题浏览:3164
  • 最近回答:2013-08-15
  • X社区推广