Received: from maia.hub.org (unknown [200.46.208.211]) by mail.postgresql.org (Postfix) with ESMTP id 571D9633662 for ; Thu, 18 Feb 2010 08:24:35 -0400 (AST) Received: from mail.postgresql.org ([200.46.204.86]) by maia.hub.org (mx1.hub.org [200.46.208.211]) (amavisd-maia, port 10024) with ESMTP id 89870-08 for ; Thu, 18 Feb 2010 12:24:17 +0000 (UTC) X-Greylist: from auto-whitelisted by SQLgrey-1.7.6 Received: from is.rice.edu (is.rice.edu [128.42.42.24]) by mail.postgresql.org (Postfix) with ESMTP id B441463362A for ; Thu, 18 Feb 2010 08:24:24 -0400 (AST) Received: from localhost (localhost [127.0.0.1]) by is.rice.edu (Postfix) with ESMTP id D6DEB4181C; Thu, 18 Feb 2010 06:26:29 -0600 (CST) Received: from is.rice.edu ([127.0.0.1]) by localhost (it.is.rice.edu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 13364-01; Thu, 18 Feb 2010 06:26:23 -0600 (CST) Received: by is.rice.edu (Postfix, from userid 18612) id 6A88441819; Thu, 18 Feb 2010 06:26:23 -0600 (CST) Date: Thu, 18 Feb 2010 06:26:22 -0600 From: Kenneth Marshall To: "A. Kretschmer" Cc: pgsql-performance@postgresql.org Subject: Re: index usage in not like Message-ID: <20100218122622.GD8639@it.is.rice.edu> References: <2a7905441002180355w6dc89a87y8643c0a7f881072a@mail.gmail.com> <20100218121810.GG23676@a-kretschmer.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100218121810.GG23676@a-kretschmer.de> User-Agent: Mutt/1.5.16 (2007-06-09) X-Virus-Scanned: by amavis-2.2.1 at is.rice.edu X-Virus-Scanned: Maia Mailguard 1.0.1 X-Spam-Status: No, hits=-1.226 tagged_above=-10 required=5 tests=AWL=-1.227, BAYES_50=0.001 X-Spam-Level: X-Archive-Number: 201002/274 X-Sequence-Number: 37695 On Thu, Feb 18, 2010 at 01:18:10PM +0100, A. Kretschmer wrote: > In response to Thom Brown : > > On 18 February 2010 11:55, AI Rumman wrote: > > > "Not like" operation does not use index. > > > > > > select * from vtiger_contactscf where lower(cf_1253) not like > > > lower('Former%') > > > > > > I created index on lower(cf_1253). > > > > > > How can I ensure index usage in not like operation? > > > Anyone please help. > > > > > > > How many rows do you have in your table? If there are relatively few, > > it probably guesses it to be cheaper to do a sequential scan and > > calculate lower values on-the-fly rather than bother with the index. > > That's one reason, an other reason, i think, is, that a btree-index can't > search with an 'not like' - operator. > > > > test=*# insert into words select 'fucking example' from generate_series(1,10000); > INSERT 0 10000 > test=*# insert into words select 'abc' from generate_series(1,10); > INSERT 0 10 > test=*# explain select * from words where lower(w) like lower('a%') or lower(w) like lower('b%'); > QUERY PLAN > ------------------------------------------------------------------------------------- > Bitmap Heap Scan on words (cost=1538.75..6933.39 rows=55643 width=36) > Recheck Cond: ((lower(w) ~~ 'a%'::text) OR (lower(w) ~~ 'b%'::text)) > Filter: ((lower(w) ~~ 'a%'::text) OR (lower(w) ~~ 'b%'::text)) > -> BitmapOr (cost=1538.75..1538.75 rows=57432 width=0) > -> Bitmap Index Scan on idx_words (cost=0.00..1027.04 rows=39073 width=0) > Index Cond: ((lower(w) ~>=~ 'a'::text) AND (lower(w) ~<~ 'b'::text)) > -> Bitmap Index Scan on idx_words (cost=0.00..483.90 rows=18359 width=0) > Index Cond: ((lower(w) ~>=~ 'b'::text) AND (lower(w) ~<~ 'c'::text)) > (8 rows) > > test=*# explain select * from words where lower(w) not like lower('a%') or lower(w) like lower('b%'); > QUERY PLAN > ------------------------------------------------------------------- > Seq Scan on words (cost=0.00..10624.48 rows=282609 width=36) > Filter: ((lower(w) !~~ 'a%'::text) OR (lower(w) ~~ 'b%'::text)) > (2 rows) > > > In other words: revert your where-condition from 'not like' to multiple 'like' conditions for all letters except 'f%'. > > > Andreas The 'not like' condition is likely to be extremely non-selective which would cause a sequential scan to be used in any event whether or not an index could be used. Cheers, Ken