X-Original-To: pgsql-general@postgresql.org Received: from spampd.localdomain (postgresql.org [64.49.215.8]) by postgresql.org (Postfix) with ESMTP id B28F94758E6; Tue, 8 Apr 2003 16:23:20 -0400 (EDT) Received: from snoopy.oit.edu (snoopy.OIT.EDU [140.211.135.12]) by postgresql.org (Postfix) with ESMTP id B61B9474E42; Tue, 8 Apr 2003 16:23:19 -0400 (EDT) Received: from cvc.net (purvine-141-62.oit.edu [140.211.141.62]) by snoopy.oit.edu (8.12.9/8.12.9/OIT-4.0) with ESMTP id h38KNJGM007905; Tue, 8 Apr 2003 13:23:19 -0700 Message-ID: <3E933048.4000805@cvc.net> Date: Tue, 08 Apr 2003 13:25:44 -0700 From: Dennis Gearon Reply-To: gearond@cvc.net User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.3b) Gecko/20030210 X-Accept-Language: en-us, ru MIME-Version: 1.0 To: Denis Cc: pgsql-performance@postgresql.org, pgsql-general@postgresql.org, pgsql-sql@postgresql.org Subject: Re: Yet Another (Simple) Case of Index not used References: In-Reply-To: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Status: No, hits=-38.8 required=5.0 tests=BAYES_01,EMAIL_ATTRIBUTION,IN_REP_TO,QUOTED_EMAIL_TEXT, REFERENCES,REPLY_WITH_QUOTES,USER_AGENT_MOZILLA_UA autolearn=ham version=2.50 X-Spam-Level: X-Spam-Checker-Version: SpamAssassin 2.50 (1.173-2003-02-20-exp) X-Archive-Number: 200304/527 X-Sequence-Number: 40592 as I remember, mysql keeps the record count in a variable and is instantaneaous with that kind of query. Recent posts suggest the Postgres does not keep that variable and has to do the seq scan. Denis wrote: > Hi there, > I'm running into a quite puzzling simple example where the index I've > created on a fairly big table (465K entries) is not used, against all common > sense expectations: > The query I am trying to do (fast) is: > > select count(*) from addresses; > > This takes more than a second to complete, because, as the 'explain' command > shows me, > the index created on 'addresses' is not used, and a seq scan is being used. > One would assume that the creation of an index would allow the counting of > the number of entries in a table to be instantanous? > > Here are the details: > > * Using the latest postgresql 7.3.2 release, built and installed from > sources on a Linux box, under Red Hat 8.0 > > * I have an 'addresses' table defined as: > Columm | Type > ------------------------------- > address | text > city | char var (20) > zip | char var (5) > state | char var (2) > Unique keys: addresses_idx > > * I have created a unique index 'addresses_idx' on (address, city, zip, > state): > \d addresses_idx; > Index "addresses_idx" > Columm | Type > ------------------------------- > address | text > city | char var (20) > zip | char var (5) > state | char var (2) > unique btree > > * I did (re)create the index several times > * I did run the vacuum analyse command several times > * I forced enable_indexscan to true > * I forced enable_seqscan to false > > Despite of all of this, each time I try: > ===> explain select count(*) from addresses; > I get the following: > ===> NOTICE: QUERY PLAN: > ===> > ===> Aggregate (cost=100012799.89..100012799.89 rows=1 width=0) > ===> -> Seq Scan on addresses (cost=100000000.00..100011635.11 rows=465911 > width=0) > > Quite puzzling, isn't it? > I've searched a bunch of mailing lists and websites, and found many reports > of special cases where it could be argued that the planner may have had a > case for choosing seq scanning over idx scanning, but unless I am missing > some fundamental concept, there's something wrong here. > Any suggestion anyone? > Thanks, > > Denis > denis@next2me.com > > > ---------------------------(end of broadcast)--------------------------- > TIP 2: you can get off all lists at once with the unregister command > (send "unregister YourEmailAddressHere" to majordomo@postgresql.org) >