Search Postgresql Archives

Performance of outer joins?

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

 



I have a situation that can be summarized to the following: 

-- day in 20061215 format 
Create table calendar (
	day integer unique not null
	); 

Create table customers (
	id serial unique not null, 
	name varchar, 
	address varchar, 
	); 

Create table deliveries (
	customers_id integer not null references customers(id), 
	calendar_day integer not null references calendar(day), 
	delivered bool not null default false, 
	unique(customers_id, calendar_id)
	); 
	
Imagine tens of thousands of customers, a few million deliveries. A query 
that's structurally similar to the following query is rather slow. It's 
taking over 30 seconds, climbing fast on reasonable HW. (SMP Opteron, 10k 
SCSI, 4 GB RAM) If I remove the outer join, performance is < 1 second. 

SELECT customers.id as customers_id, 
	customers.name AS customers_name, 
	calendar.day AS calendar_day, 
	CASE WHEN (deliveries.delivered IS NULL) THEN 'n/a' 
		WHEN (deliveries.delivered=TRUE) THEN 'yes'
		ELSE 'no' END AS delivered
	FROM customers 
	JOIN calendars ON 
		(
		-- GIVE A CALENDAR OF POSSIBLE DAYS FOR DELIVERIES 
		calendar.day < 20061201
		AND calendar.day >= 20060101
		) 
	LEFT OUTER JOIN deliveries ON 
		( 
		customers.id=deliveries.customers_id 
		AND deliveries.calendar_day=calendar.day 
		) 
	; 

What can I do to improve the performance of this oft-used query? Is there a 
better way to do this, or am I doomed to looping thru results and parsing the 
results in code? 

Thanks, 

-Ben 

-- 
"I kept looking around for somebody to solve the problem. 
Then I realized I am somebody" 
   -Anonymous


[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