Обсуждение: Accelerating subqueries

Поиск
Список
Период
Сортировка

Accelerating subqueries

От
Fabrice Scemama
Дата:
Hi fellow PostgreSQL users.

Here's a query:

DELETE FROM Annonces WHERE Id_Ag IN
(
    SELECT Id FROM Installs
    WHERE Si_Compte_Actif = 'f'
);

This query will take more than one hour of CPU time
on a PII 333 to execute. Table Installs has about 3000
tuples, and table Annonces about 50.000 .
All Id* fields are primary keys not null default nextval('...seq').
Here's the query plan:

Seq Scan on annonces  (cost=4551.58 rows=52048 width=6)
  SubPlan
    ->  Seq Scan on installs  (cost=375.06 rows=4736 width=4)

EXPLAIN

On the other hand, I've coded a little Perl script that
does the same thing, but another way. Here it is:

-------------------------cut
use strict;
use DBI;
my $dbh = DBI->connect('DBI:Pg:dbname=mydb', 'user', 'pass',
    { AutoCommit => 0} );

my $sth_Bind;
{
    my $query = "DELETE FROM annonces where Id_Ag = ?";
    $sth_Bind = $dbh->prepare($query);
}

my $query = "
    SELECT Id, Code_Ag FROM Installs
    where si_compte_actif='f'
    ORDER BY Code_Ag
";
my $sth = $dbh->prepare($query);
$sth->execute;
while(my @row = $sth->fetchrow_array) {
    print "$$> Code_Ag: [$row[1]]\n";
    $sth_Bind->execute($row[0]);
}
$sth->finish;

print "\n\nOK?";<STDIN>;
$dbh->commit;
$dbh->disconnect;
------------------------cut


And this script will do the DELETE within less
than a minute.
Any ideas about a way to write a single query that fast ?

Fabrice Scemama

Re: Accelerating subqueries

От
Herbert Liechti
Дата:
Fabrice Scemama wrote:
>
> Hi fellow PostgreSQL users.
>
> Here's a query:
>
> DELETE FROM Annonces WHERE Id_Ag IN
> (
>     SELECT Id FROM Installs
>     WHERE Si_Compte_Actif = 'f'
> );

The IN Clause is known to be very very slow. Use the
EXISTS Clause instead.

Regards Herbie
--
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Herbert Liechti                     E-Mail: Herbert.Liechti@thinx.ch
ThinX networked business services        Stahlrain 10, CH-5200 Brugg
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Re: Accelerating subqueries

От
Ed Loehr
Дата:
Fabrice Scemama wrote:
>
> DELETE FROM Annonces WHERE Id_Ag IN
> (
>     SELECT Id FROM Installs
>     WHERE Si_Compte_Actif = 'f'
> );
>
> This query will take more than one hour of CPU time

> Any ideas about a way to write a single query that fast ?

http://www.postgresql.org/docs/faq-english.html#4.23

Re: Accelerating subqueries

От
"Moray McConnachie"
Дата:
----- Original Message -----
From: "Fabrice Scemama" <fabrices@ximmo.ftd.fr>
To: <pgsql-general@hub.org>
Sent: Thursday, April 06, 2000 4:03 PM
Subject: [GENERAL] Accelerating subqueries


> Hi fellow PostgreSQL users.
>
> Here's a query:
>
> DELETE FROM Annonces WHERE Id_Ag IN
> (
>     SELECT Id FROM Installs
>     WHERE Si_Compte_Actif = 'f'
> );
>

DELETE FROM Annonces WHERE EXISTS (SELECT Id FROM Installs WHERE
Si_Compte_Actif ='f' AND Installs.Id=Annonces.Id_Ag);

ought to be a lot faster if you have indices on all concerned fields.

But this should be faster still;

DELETE FROM Annonces WHERE Annonces.Id_Ag=Installs.Id AND
Installs.Si_Compte_Actif='f';

Yours,
Moray