pg.ddx.io  pgsql-performance@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: PFC <lists@peufeu.com>
To: Andrus <eetasoft@online.ee>
To: pgsql-performance@postgresql.org
Subject: Re: Query runs too long for indexed tables
Date: Wed, 05 Apr 2006 13:25:05 +0200
Message-ID: <op.s7i8n3lwcigqcu@apollo13> (raw)
In-Reply-To: <e106r0$1h75$1@news.hub.org>
References: <e0ui0o$2v0m$2@news.hub.org>
	<1144180128.32266.56.camel@state.g2switchworks.com>
	<e1039l$15ie$1@news.hub.org>
	<op.s7i5sfy2cigqcu@apollo13>
	<e106r0$1h75$1@news.hub.org>

> outer joins are not supported in Postgres UPDATE command.

	True (and sad).

	You can try the following script to play with the various options :


DROP TABLE one;
DROP TABLE two;

CREATE TABLE one (a SERIAL PRIMARY KEY, b INT NULL);
CREATE TABLE two (b INT NOT NULL PRIMARY KEY);
INSERT INTO two (b) SELECT x*2 FROM generate_series( 1, 50000 ) AS x;
INSERT INTO one (b) SELECT x FROM generate_series( 1, 100000 ) AS x;

EXPLAIN ANALYZE SELECT count(*) FROM one LEFT JOIN two ON one.b=two.b  
WHERE two.b IS NULL;

--Try with and without...
--CREATE INDEX one_b ON one(b);

VACUUM ANALYZE one;
VACUUM ANALYZE two;

EXPLAIN ANALYZE SELECT count(*) FROM one LEFT JOIN two ON one.b=two.b  
WHERE two.b IS NULL;

BEGIN;
EXPLAIN ANALYZE UPDATE one SET b=NULL WHERE b NOT IN (SELECT b FROM two );
SELECT * FROM one ORDER BY a LIMIT 5;
ROLLBACK;
VACUUM one;

BEGIN;
EXPLAIN ANALYZE UPDATE one SET b=NULL WHERE b IN (SELECT one.b FROM one  
LEFT JOIN two ON one.b=two.b WHERE two.b IS NULL);
SELECT * FROM one ORDER BY a LIMIT 5;
ROLLBACK;
VACUUM one;

BEGIN;
EXPLAIN ANALYZE UPDATE one SET b=NULL FROM one x LEFT JOIN two ON  
x.b=two.b WHERE two.b IS NULL AND one.a=x.a;
SELECT * FROM one ORDER BY a LIMIT 5;
ROLLBACK;
VACUUM one;

BEGIN;
EXPLAIN ANALYZE UPDATE one SET b=NULL FROM one x LEFT JOIN two ON  
x.b=two.b WHERE two.b IS NULL AND one.b=x.b;
SELECT * FROM one ORDER BY a LIMIT 5;
ROLLBACK;
VACUUM one;

BEGIN;
EXPLAIN ANALYZE UPDATE one SET b=(SELECT two.b FROM two WHERE two.b=one.b);
SELECT * FROM one ORDER BY a LIMIT 5;
ROLLBACK;
VACUUM one;

BEGIN;
EXPLAIN ANALYZE UPDATE one SET b=NULL WHERE NOT EXISTS (SELECT 1 FROM two  
WHERE two.b = one.b);
SELECT * FROM one ORDER BY a LIMIT 5;
ROLLBACK;
VACUUM one;

BEGIN;
CREATE TABLE tmp AS SELECT one.a, two.b FROM one LEFT JOIN two ON  
one.b=two.b;
SELECT * FROM tmp ORDER BY a LIMIT 5;
DROP TABLE one;
ALTER TABLE tmp RENAME TO one;
ROLLBACK;





view thread (9+ messages)  latest in thread

Message-ID: <op.s7i8n3lwcigqcu@apollo13>
Permalink:  ../op.s7i8n3lwcigqcu@apollo13/
Also on:    postgresql.org/message-id/op.s7i8n3lwcigqcu@apollo13

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-performance@postgresql.org
  Cc: lists@peufeu.com, eetasoft@online.ee
  Subject: Re: Query runs too long for indexed tables
  In-Reply-To: <op.s7i8n3lwcigqcu@apollo13>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox