X-Original-To: pgsql-performance-postgresql.org@localhost.postgresql.org Received: from localhost (unknown [200.46.204.144]) by svr1.postgresql.org (Postfix) with ESMTP id B863752A76 for ; Mon, 28 Mar 2005 22:09:03 +0100 (BST) Received: from svr1.postgresql.org ([200.46.204.71]) by localhost (av.hub.org [200.46.204.144]) (amavisd-new, port 10024) with ESMTP id 82207-04 for ; Mon, 28 Mar 2005 21:08:59 +0000 (GMT) Received: from cmailg1.svr.pol.co.uk (cmailg1.svr.pol.co.uk [195.92.195.171]) by svr1.postgresql.org (Postfix) with ESMTP id F22F352A5F for ; Mon, 28 Mar 2005 22:08:58 +0100 (BST) Received: from modem-2674.llama.dialup.pol.co.uk ([217.135.186.114] helo=192.168.0.102) by cmailg1.svr.pol.co.uk with esmtp (Exim 4.14) id 1DG1Td-0000IM-92; Mon, 28 Mar 2005 22:08:49 +0100 Subject: Re: Delete query takes exorbitant amount of time From: Simon Riggs To: Karim A Nassar Cc: Stephan Szabo , Tom Lane , Christopher Kings-Lynne , pgsql-performance@postgresql.org In-Reply-To: References: Content-Type: text/plain Organization: 2nd Quadrant Date: Mon, 28 Mar 2005 22:07:25 +0100 Message-Id: <1112044045.11750.919.camel@localhost.localdomain> Mime-Version: 1.0 X-Mailer: Evolution 2.0.2 (2.0.2-3) Content-Transfer-Encoding: 7bit X-Virus-Scanned: by amavisd-new at hub.org X-Spam-Status: No, hits=0.048 tagged_above=0 required=5 tests=AWL, FORGED_RCVD_HELO X-Spam-Level: X-Archive-Number: 200503/614 X-Sequence-Number: 11319 On Mon, 2005-03-28 at 13:03 -0700, Karim A Nassar wrote: > > Well, based upon the evidence so far, the Optimizer got it right: > > Agreed. So, this means that the answer to my original question is "that > delete gonna take a long time"? > > Seems that there is still something wrong. From what I can tell from > everyones questions, the FK constraint on measurement is causing multiple > seq scans for each value deleted from int_sensor_meas_type. However, when > deleting a single value, the FK check should use the index, so my ~190 > deletes *should* be fast, no? No. > > IndexScan, value=1 elapsed= 29ms cost=883881 > > 190 * 29ms is much less than 40 minutes. What am I missing here? It all depends upon your data. There are *no* values in *your* table that take 29ms to delete... > > Karim, > > Please do: > > > > select id_int_sensor_meas_type, count(*) > > from measurement > > group by id_int_sensor_meas_type > > order by count(*) desc; > > id_int_sensor_meas_type | count > -------------------------+-------- > 31 | 509478 > 30 | 509478 > 206 | 509478 > 205 | 509478 > 204 | 509478 > 40 | 509478 > 39 | 509478 > 197 | 509478 > 35 | 509478 > 34 | 509478 > 33 | 509478 > 32 | 509478 > 41 | 509477 > > This sample dataset has 13 measurements from a weather station over 3 > years, hence the even distribution. Each value has 1/13th of the table, which is too many rows per value to make an IndexScan an efficient way of deleting rows from the table. Thats it. If you have more values when measurement is bigger, the delete will eventually switch plans (if you reconnect) and use the index. But not yet. There's a few ways to (re)design around it, but the distribution of your data is not *currently* conducive to the using an index. Best Regards, Simon Riggs