Received: from localhost (maia-4.hub.org [200.46.204.183]) by postgresql.org (Postfix) with ESMTP id 5FB5A9FB312 for ; Mon, 19 Mar 2007 09:02:14 -0300 (ADT) Received: from postgresql.org ([200.46.204.71]) by localhost (mx1.hub.org [200.46.204.183]) (amavisd-new, port 10024) with ESMTP id 38742-03 for ; Mon, 19 Mar 2007 09:02:10 -0300 (ADT) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.4 Received: from ug-out-1314.google.com (ug-out-1314.google.com [66.249.92.171]) by postgresql.org (Postfix) with ESMTP id 931309FB2F1 for ; Mon, 19 Mar 2007 09:02:10 -0300 (ADT) Received: by ug-out-1314.google.com with SMTP id k3so1155953ugf for ; Mon, 19 Mar 2007 05:02:09 -0700 (PDT) DKIM-Signature: a=rsa-sha1; c=relaxed/relaxed; d=gmail.com; s=beta; h=domainkey-signature:received:received:to:subject:date:user-agent:references:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:message-id:from; b=TdAz2JwtEO5piWIcvRvL0lPh/vdd4vt5dv6DfSXx3FxPQLVV3xcZFNkLWEKbQPcoSCuk1pLZJnY7D4kJ0j/RCv/CbdDtheOQ8u/yo3xP2rfHJgUa/aY4lvDhNs1FsTRy9015ID9MsuGfAUp+WzN2d7Lt6M3XMrP3sieJuaMbIgQ= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=beta; h=received:to:subject:date:user-agent:references:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:message-id:from; b=ffcfvrmZim9b31aL0CieHiubHiTChTiLCjQKp1993mwxXNCmxdGyiD/A9fpEZalVQrbQm476nJzSbDkXlN1eOjIhiZpNcnKHnq4Bl1m0iquaAW07w9wiAYe7cj+2PWJgE8n0PlFvy5w3dE1TJl1hJHPY3w7uKUdt3iuQrX1XaIo= Received: by 10.67.19.20 with SMTP id w20mr9717669ugi.1174305729174; Mon, 19 Mar 2007 05:02:09 -0700 (PDT) Received: from ?192.168.128.42? ( [62.94.42.33]) by mx.google.com with ESMTP id 53sm7123015ugn.2007.03.19.05.02.07; Mon, 19 Mar 2007 05:02:08 -0700 (PDT) To: pgsql-performance@postgresql.org Subject: Re: text equality worse than pattern matching (v8.1.8) Date: Mon, 19 Mar 2007 13:02:57 +0100 User-Agent: KMail/1.9.5 References: <200703181059.19708.Vincenzo.Romano@gmail.com> In-Reply-To: <200703181059.19708.Vincenzo.Romano@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-15" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200703191302.57151.Vincenzo.Romano@gmail.com> From: Vincenzo Romano X-Virus-Scanned: Maia Mailguard 1.0.1 X-Archive-Number: 200703/276 X-Sequence-Number: 23681 The problem seems due to a weird LOCALES setup: the default DB locale was UTF8 while the tables and the client encodig were LATIN9. The index in the reco_alphanum field had no special operator class defined. A complete initdb and a reload of everything with the same locale (LATIN9) fixed the issue, though I'm not sure whether this is an "expected feature" or not. Thanks a lot. P.S. I've seen hubert depesz lubaczewski's remark only on the web interface on nabble.com. The email from the list manager never reached my mailbox! On Sunday 18 March 2007 10:59 Vincenzo Romano wrote: > I'm running in some weird (IMHO) bahviour. > When I search a table for certain text (equality est on the relelvant > field) it takes much more time than doing the same test by adding a > trailing '%' and using the LIKE operator. > With much more I mean 1000+ times slower. > > This is the table (sorry for the Italian strings): > > ----| PSQL |---- > noa=# \d ts_t_records > Tabella "public.ts_t_records" > Colonna | Tipo | > Modificatori > ---------------+--------------------------+-------------------------------- >-------------------------------------- fiel_uniqueid | bigint > | not null > item_uniqueid | bigint | not null > reco_alphanum | text | not null default ''::text > reco_floating | double precision | default 0.0 > reco_integral | bigint | default 0 > reco_timedate | timestamp with time zone | default now() > reco_isactive | boolean | default true > reco_effectiv | timestamp with time zone | default '-infinity'::timestamp > with time zone > reco_uniqueid | bigint | not null default > nextval('ts_t_records_reco_uniqueid_seq'::regclass) > Indici: > "ts_i_records_0" btree (item_uniqueid) > "ts_i_records_1" btree (reco_uniqueid) > "ts_i_records_2" btree (reco_isactive, reco_effectiv) > "ts_i_records_3" btree (reco_alphanum) > "ts_i_records_4" btree (fiel_uniqueid) > ----| /PSQL |---- > > And these are the EXPLAINs for the queries: > ----| PSQL |---- > noa=# EXPLAIN SELECT * FROM ts_t_records WHERE fiel_uniqueid=2 AND > reco_alphanum='TEST' AND reco_isactive AND reco_effectiv<=NOW(); > QUERY PLAN > --------------------------------------------------------------------------- >--------------- Bitmap Heap Scan on ts_t_records (cost=5110.50..6191.86 > rows=277 width=65) Recheck Cond: ((reco_alphanum = 'TEST'::text) AND > (fiel_uniqueid = 2)) Filter: (reco_isactive AND (reco_effectiv <= now())) > -> BitmapAnd (cost=5110.50..5110.50 rows=277 width=0) > -> Bitmap Index Scan on ts_i_records_3 (cost=0.00..36.32 > rows=5234 width=0) > Index Cond: (reco_alphanum = 'TEST'::text) > -> Bitmap Index Scan on ts_irecords_4 (cost=0.00..5073.93 > rows=812550 width=0) > Index Cond: (fiel_uniqueid = 2) > (8 righe) > > noa=# EXPLAIN SELECT * FROM ts_t_records WHERE fiel_uniqueid=2 AND > reco_alphanum LIKE 'TEST%' AND reco_isactive AND reco_effectiv<=NOW(); > QUERY PLAN > --------------------------------------------------------------------------- >------------------------------------------ Index Scan using ts_i_records_3 > on ts_t_records (cost=0.00..6.01 rows=1 width=65) > Index Cond: ((reco_alphanum >= 'TEST'::text) AND (reco_alphanum > < 'TESU'::text)) > Filter: ((fiel_uniqueid = 2) AND (reco_alphanum ~~ 'TEST%'::text) AND > reco_isactive AND (reco_effectiv <= now())) > (3 righe) > > ----| /PSQL |---- > > Not only are query plans very different, but the equality query is much > worse than the pattern matching one. > > In my (maybe wrong) mind I expected the reverse. > > What's wrong with the my expectations? Am I missing something? > > MTIA. -- Vincenzo Romano ---- Maybe Computers will never become as intelligent as Humans. For sure they won't ever become so stupid. [VR-1987]