Pg takes at least 2 hours to retrieve 7650 rows

Started by José Soaresover 26 years ago4 messages
#1José Soares
jose@sferacarta.com

Hi all,

I have two tables MOVIMENTAZIONI with 7650 rows
CAPI with 7650 rows, when I try to join this two tables PostgreSQL
takes more than 107 minutes to retrieve rows,
the same query in:
I have installed Oracle-8 and Informix-se in the same computer
and the same query takes:
- Informix about 6 seconds.
- Oracle about 2 seconds.

I tried it also in:
- M$-Access about 3 seconds.

I'm sure this is not a vaccum problem because I executed vacuum before
I ran the query.

CREATE TABLE capi (
matricola CHAR(15) NOT NULL,
specie CHAR(2) NOT NULL,
nascita DATE,
sesso CHAR(1) DEFAULT 'F',
razza CHAR(3),
madre CHAR(15),
padre CHAR(15),
azienda_origine CHAR(08),
fiscale_origine CHAR(16),
paese_origine CHAR(03),
iscritto BOOLEAN,
data_aggiornamento TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (matricola,specie)
);

CREATE TABLE movimentazioni (
azienda CHAR(11) NOT NULL,
specie CHAR(2) NOT NULL,
matricola CHAR(15) NOT NULL,
data_introduzione DATE NOT NULL,
tipo_introduzione CHAR(2),
azienda_provenienza CHAR(8),
fiscale_provenienza CHAR(16),
matricola_precedente CHAR(15),
data_applicazione DATE,
data_uscita DATE,
ragione_uscita CHAR(1),
tipo_destinazione CHAR(1),
azienda_destinazione CHAR(8),
fiscale_destinazione CHAR(16),
paese_destinazione CHAR(3),
Mattatoio CHAR(19),
n_proprietario INTEGER,
data_aggiornamento TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (azienda,matricola,specie,data_introduzione)
);

$ psql -c 'vacuum'
VACUUM
$ time psql -f test.sql 2>/dev/null >/dev/null
SELECT movimentazioni.azienda
FROM movimentazioni,capi
where ((capi.matricola = movimentazioni.matricola )
and (capi.specie = movimentazioni.specie ) );

real 107m48.354s
user 0m1.140s
sys 0m0.040s

Informix-se:
real 0m6.348s
user 0m2.250s
sys 0m0.140s

Oracle-8:
real 0m2.118s
user 0m0.780s
sys 0m0.120s

This is my environment:

- [PostgreSQL 6.5.0 on i586-pc-linux-gnu, compiled by gcc 2.7.2.3]
- Pgsql snapshot Apr 15 17:42
- postmaster -i -o -F -B 512 -S
- Linux 2.0.36 Debian
- cpu: 586
- model: Pentium MMX
- vendor_id: GenuineIntel
- RAM: 63112
- Swap: 102812

I tried the same query in v6.4 with best results.
real 3m45.968s
user 0m0.060s
sys 0m0.160s

I tried the same query with joins inverted as:
$ psql -c 'vacuum'
VACUUM
$ time psql -f test.sql 2>/dev/null >/dev/null
SELECT movimentazioni.azienda
FROM movimentazioni,capi
where (capi.specie = movimentazioni.specie )
and ((capi.matricola = movimentazioni.matricola ))
real 0m4.312s
user 0m1.220s
sys 0m0.090s

PostgreSQL version 6.4:
real 0m0.600s
user 0m0.130s
sys 0m0.030s

I thougth v6.5 was faster than v6.4

Any ideas?
Jose'

#2Vadim Mikheev
vadim@krs.ru
In reply to: José Soares (#1)
Re: [HACKERS] Pg takes at least 2 hours to retrieve 7650 rows

Jos� Soares wrote:

$ time psql -f test.sql 2>/dev/null >/dev/null
SELECT movimentazioni.azienda
FROM movimentazioni,capi
where ((capi.matricola = movimentazioni.matricola )
and (capi.specie = movimentazioni.specie ) );

EXPLAIN ?

$ time psql -f test.sql 2>/dev/null >/dev/null
SELECT movimentazioni.azienda
FROM movimentazioni,capi
where (capi.specie = movimentazioni.specie )
and ((capi.matricola = movimentazioni.matricola ))

EXPLAIN ?

Vadim

#3Zeugswetter Andreas IZ5
Andreas.Zeugswetter@telecom.at
In reply to: Vadim Mikheev (#2)
AW: [HACKERS] Pg takes at least 2 hours to retrieve 7650 rows

real 107m48.354s
user 0m1.140s
sys 0m0.040s

Please give us output of:
explain SELECT movimentazioni.azienda

FROM movimentazioni,capi
where ((capi.matricola = movimentazioni.matricola )
and (capi.specie = movimentazioni.specie ) );

Andreas

PS: what it should do is seq scan on movimentazioni and index path
on capi
what it could do if it was implemented is full index scan on
movimentazioni

#4José Soares
jose@sferacarta.com
In reply to: José Soares (#1)
Re: [HACKERS] Pg takes at least 2 hours to retrieve 7650 rows

Vadim Mikheev ha scritto:

Jos� Soares wrote:

$ time psql -f test.sql 2>/dev/null >/dev/null
SELECT movimentazioni.azienda
FROM movimentazioni,capi
where ((capi.matricola = movimentazioni.matricola )
and (capi.specie = movimentazioni.specie ) );

EXPLAIN ?

explain SELECT movimentazioni.azienda
FROM movimentazioni,capi
where ((capi.matricola = movimentazioni.matricola )
and (capi.specie = movimentazioni.specie ) );
NOTICE: QUERY PLAN:

Hash Join (cost=1221.38 size=2 width=60)
-> Seq Scan on movimentazioni (cost=349.64 size=7565 width=36)
-> Hash (cost=0.00 size=0 width=0)
-> Seq Scan on capi (cost=335.55 size=7562 width=24)

EXPLAIN

$ time psql -f test.sql 2>/dev/null >/dev/null
SELECT movimentazioni.azienda
FROM movimentazioni,capi
where (capi.specie = movimentazioni.specie )
and ((capi.matricola = movimentazioni.matricola ))

EXPLAIN ?

Vadim

explain SELECT movimentazioni.azienda
FROM movimentazioni,capi
where (capi.specie = movimentazioni.specie )
and ((capi.matricola = movimentazioni.matricola ));
NOTICE: QUERY PLAN:

Hash Join (cost=1221.38 size=2 width=60)
-> Seq Scan on movimentazioni (cost=349.64 size=7565 width=36)
-> Hash (cost=0.00 size=0 width=0)
-> Seq Scan on capi (cost=335.55 size=7562 width=24)

EXPLAIN