Search Postgresql Archives

Performance woes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I have a small company growing fast, selling a product based largely on 
Postgres. We have a rapidly growing database with (currently) 117 tables. 

Our primary server, an aging system based around an IDE, 2.4 Ghz P4, is being 
replaced by a new, 10k SCSI, dual-proc AMD opteron/64, with 4 GB of ECC RAM. 

At just about every task, the newer machine just blows away the P4. Rebuilding 
the database happens in < 1 minute, instead of nearly 1/2 hour! Copying GB of 
data files is blazing fast! 

But, the real money shot is a single query. It's big, nasty, and complex, and 
hit pretty hard. It's not IO bound, it is clearly CPU bound. I've allocated 
up to 3 GB of RAM for pg, and tweaked the shmmax and shared_buffers. 

And, it's exactly as fast on the new, dual-proc Opteron as the aging P4. 2.2 
seconds. It's literally within 1 ms time! (2,206 ms vs 2,207 ms) Throwing 
more RAM at it makes no difference. 

WTF??!?!? 

A few questions: 

1) Let's assume that I have some multipile foreign keys, and I join on three 
values. For example: 

Create table gangsters ( 
	name varchar not null, 
	birthdate integer not null, 
	shirtnumber integer not null, 
	primary key (name, birthdate, shirtnumber); 

create table children ( 
	father_name varchar not null, 
	father_bd integer not null, 
	father_shirtnumber integer not null, 
	birthdate integer not null, 
	name varchar not null, 
	foreign key (father_name, father_bd, father_shirtnumber) REFERENCES 
		gangsters(name, birthdate, shirtnumber)
	); 

We have two table declarations, each with implicit indexes: 
	1) table gangsters has a primary_key index on name, birthdate, shirtnumber. 
	2) children has an implicit index on father_name, father_bd, 
father_shirtnumber. (right?) 

If I were to join on gangster and children, EG: 

Select gangster.name AS father, 
gangster.birirthdate AS father_bd, 
children.name AS kid_name 
from gangster, children 
where gangster.name=children.father_name 
AND gangster.birthdate = children.father_bd
AND gangster.shirtnumber=children.father_shirtnumber; 

Wouldn't this use the indexes implicitly created in the primary_key and 
foreign key constraints? 



-- 
"The best way to predict the future is to invent it."
- XEROX PARC slogan, circa 1978


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux