[SQL] a general ? on select performance

2010-08-28 Thread John Fabiani
Hi,
In general what are the causes of SQL select statement slow downs - other than 
the size of the data?  I realize this is a broad question but read on please.

Here's where I'm coming from:

I have program that loops though several thousands of records.  The loop 
contains a select statement that confirms that I don't have a dup and then 
inserts a record into a different table.  IOW's the statement is checking 
against a static table.  The size of the table I'm checking does not change 
during the loop.  I'm sure many have done something similar.

The loop performs very well for the first 500 - 800 items.  Then starts 
slowing down. And somewhere around 1200 really slows to a crawl.  To the point 
it does not complete in a 12 hour period. But when I take  several of the 
statements and execute them using pgAdmin - they take almost no time (0.001 if 
memory serves)

for rec in check_set_data:
select pkid from check_table where check_field = rec.field_name
if found
   skip
else insert into new table.

I'm using 8.4 on openSUSE 11.3 multi-processor, 8 GB of ram.

Johnf



 

-- 
Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-sql


Re: [SQL] a general ? on select performance

2010-08-28 Thread Tom Lane
John Fabiani jo...@jfcomputer.com writes:
 I have program that loops though several thousands of records.  The loop 
 contains a select statement that confirms that I don't have a dup and then 
 inserts a record into a different table.  IOW's the statement is checking 
 against a static table.  The size of the table I'm checking does not change 
 during the loop.  I'm sure many have done something similar.

Are you really, truly making *no* changes to the table you're reading?

What I'm suspecting is that you are making such changes, in fact lots
of them.  The number of live rows may not change, but the table is
bloating with lots of dead row versions, which can't be cleaned up yet
since the transaction that deleted them is still open.  This leads to
O(N^2) or worse slowdown.

There are usually ways around this type of problem, but we'd need more
details about what you're really doing.

regards, tom lane

-- 
Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-sql


Re: [SQL] a general ? on select performance

2010-08-28 Thread John Fabiani
On Saturday, August 28, 2010 08:35:07 am Tom Lane wrote:
 John Fabiani jo...@jfcomputer.com writes:
  I have program that loops though several thousands of records.  The loop
  contains a select statement that confirms that I don't have a dup and
  then inserts a record into a different table.  IOW's the statement is
  checking against a static table.  The size of the table I'm checking
  does not change during the loop.  I'm sure many have done something
  similar.
 
 Are you really, truly making *no* changes to the table you're reading?
 
 What I'm suspecting is that you are making such changes, in fact lots
 of them.  The number of live rows may not change, but the table is
 bloating with lots of dead row versions, which can't be cleaned up yet
 since the transaction that deleted them is still open.  This leads to
 O(N^2) or worse slowdown.
 
 There are usually ways around this type of problem, but we'd need more
 details about what you're really doing.
 
   regards, tom lane

I'm not making any changes to the lookup table.  But I did discover the 
performance problem - rather I was helped into the light (used the IRC).  
There is a custom function in my select statement.  It turns out that the 
function was labeled as VOLATILE and a simple change to 'STABLE' made all 
the difference in the world.  I was not aware of this setting (I won't forget 
it).  Learn something everyday!  

But your answer has me thinking.  I often do exactly what you are describing 
(of course not for thousands of records).  So how does one get around the 
issues bloat?

Johnf