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

声明:文中观点为作者的个人观点、不代表官方、如需更多帮助,请联系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 = > < != >< >= <=等,对于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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/11022757/viewspace-719832/

你可能感兴趣的:(Greenplum使用index处理like条件是很有趣的)