ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Greenplum使用index处理like条件是很有趣的

Greenplum使用index处理like条件是很有趣的

原创 Linux操作系统 作者:esena 时间:2012-03-29 16:27:50 0 删除 编辑
声明:文中观点为作者的个人观点、不代表官方、如需更多帮助,请联系Pivotal官方·转载必须注明出处
早先也没注意过like在GP是如何使用index处理like条件的,因为在常见的场景中,OLAP的使用方式
不太会使用这种查询方式,所以也就没太考虑使用index来加速like的查询。
最近有人问到这个问题,建好了索引,analyze也做了,但是like条件怎么都不走索引,于是我开始自己
找问题。
开始为一个列建立一个索引,查看like条件查询的explain信息,发现确实没有使用index,不管有没有百分号(%)
还是百分号放在哪一端,当然使用正则like(~~)也不会有效果。
发现变通为>= AND <是走索引的,但不能这样给客户交代,因为没人知道中文中<该用什么。
比如like '123%' 等效为 >='123' AND < '124',如果是中文就无能为力了。

于是开始找原因,当然google是最好的帮手了。
结合InstallGuide的说明,发现原来与locale设置有关,解决了locale设置之后发现索引真的有效了,不过比较有趣
的事情是,GP的处理方式也是>= AND <这个事情是很有意思的,不过也好理解,因为index通常有效的运算符就是
= > < != >< >= <=等,对于like的处理,GP的办法是这样的:
当locale设置合理时,GP就知道所有的符号如何排序,知道B>A,且对所有汉字有效,于是等效处理方式就派上用场了。
我们看一下explain的效果:
explain
select * from testtb where clm like '中华%和%';
"Gather Motion 2:1 (slice1; segments: 2) (cost=0.00..204.27 rows=268 width=15)"
" -> Index Scan using testtb_idx_clm on testtb (cost=0.00..204.27 rows=268 width=15)"
" Index Cond: clm::text >= '中华'::character varying AND clm::text < '中协'::character varying"
" Filter: clm::text ~~ '中华%和%'::text"

select ascii('协'),ascii('华');
21327;21326

声明:文中观点为作者的个人观点、不代表官方、如需更多帮助,请联系Pivotal官方·转载必须注明出处

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/11022757/viewspace-719832/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-03-29

  • 博文量
    18
  • 访问量
    89688