Received: from localhost (postgresql.org [64.49.215.8]) by postgresql.org (Postfix) with ESMTP id A688C476BE4 for ; Thu, 26 Sep 2002 15:25:06 -0400 (EDT) Received: from news.hub.org (news.hub.org [64.49.215.80]) by postgresql.org (Postfix) with ESMTP id 32AD9476BD6 for ; Thu, 26 Sep 2002 15:25:06 -0400 (EDT) Received: by news.hub.org (Postfix, from userid 8) id 75608381659; Thu, 26 Sep 2002 15:25:05 -0400 (EDT) From: Dmitry Tkach X-Newsgroups: comp.databases.postgresql.sql Subject: Re: Help tuning query Date: Thu, 26 Sep 2002 15:15:04 -0400 Organization: Hub.Org Networking Services (http://www.hub.org) Lines: 106 Message-ID: <3D935CB8.10500@openratings.com> References: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-Complaints-To: news@hub.org To: Kevin Traub User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.7+) Gecko/20020123 X-Accept-Language: en-us To: pgsql-sql@postgresql.org X-Virus-Scanned: by AMaViS new-20020517 X-Archive-Number: 200209/337 X-Sequence-Number: 9614 First of all, try replacing the username/foldername indexes on operator_messages with a single combined index on, say (username,foldername)... It is still not clear to me why it decides not to use one of those indexes you have (it would be less efficient than a combined index, but still better than a seq. scan) - let's see if having a combined index helps... If it doesn't, we'll need to look deeper into what exactly it is that makes it choose seqscan over an index... I hope, it helps... Dima Kevin Traub wrote: > All; > > Can anyone please help with the tuning of this query? > With 77000 rows in the operator_messages database the query is taking almost > 15 seconds to return. Preference woul dbe under 5 seconds if possible. > System load on a dual processor P3 with 1.5GB of memory remains under .4 > during the query. > The query and explain are noted below as well as description of the tables; > Note both ANALYZE and VACUUM have been run numerous times. > any help would be appreciated. -Kev > > > virgin=# explain SELECT opr.msg_id, opr.status, opc.std_time > virgin-# FROM op_msg_folder opc, operator_messages opr > virgin-# WHERE opr.username = 'khp' > virgin-# AND opr.foldername = 'inbox' > virgin-# and opr.msg_id = opc.msg_id; > NOTICE: QUERY PLAN: > > Merge Join (cost=25037.29..27675.47 rows=47958 width=54) > -> Index Scan using opmf_i on op_msg_folder opc (cost=0.00..1797.37 > rows=48579 width=32) > -> Sort (cost=25037.29..25037.29 rows=47958 width=22) > -> Seq Scan on operator_messages opr (cost=0.00..20722.26 > rows=47958 width=22) > > virgin=# \d operator_messages > Table "operator_messages" > Column | Type | Modifiers > ------------+--------------+----------- > msg_id | numeric | > username | text | > foldername | text | > status | character(1) | > Indexes: op_msgs_i, > opr_msgs_foldername_i, > opr_msgs_username_i > > virgin=# \d op_msgs_i > Index "op_msgs_i" > Column | Type > --------+--------- > msg_id | numeric > btree > > virgin=# \d opr_msgs_foldername_i > Index "opr_msgs_foldername_i" > Column | Type > ------------+------ > foldername | text > btree > > virgin=# \d opr_msgs_username_i > Index "opr_msgs_username_i" > Column | Type > ----------+------ > username | text > btree > > virgin=# \d op_msg_folder > Table "op_msg_folder" > Column | Type | Modifiers > ----------------+--------------+----------- > msg_id | numeric | > status | character(1) | > std_time | text | > julian_time | text | > smi | character(3) | > description | text | > type | text | > flight | text | > tail | text | > dep_station | text | > dest_station | text | > op_description | text | > Unique keys: opmf_i > > virgin=# \d opmf_i; > Index "opmf_i" > Column | Type > --------+--------- > msg_id | numeric > unique btree > > >