Re: [SQL] Techniques for quickly finding words in a phrase...

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: "Saltsgaver, Scott" <scottsa(at)aiinet(dot)com>
Cc: "'pgsql-sql(at)postgreSQL(dot)org'" <pgsql-sql(at)postgreSQL(dot)org>
Subject: Re: [SQL] Techniques for quickly finding words in a phrase...
Date: 2000-02-11 23:08:43
Message-ID: 21821.950310523@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql

"Saltsgaver, Scott" <scottsa(at)aiinet(dot)com> writes:
> SELECT p.id, phrase FROM Phrase AS p, PhraseWords AS pw
> WHERE
> ((p.id = pw.id) AND word LIKE 'WAS%')
> AND EXISTS (SELECT id FROM PhraseWords AS pw
> WHERE (p.id = pw.id) AND word LIKE 'WHIT%')
> AND EXISTS (SELECT id FROM PhraseWords AS pw
> WHERE (p.id = pw.id) AND word LIKE 'SNOW%');

> For some reason, the select still takes > 1 minute on a fairly decent
> sized Linux box (500Mhz, 128MB ram).

Subselects are pretty inefficient in Postgres at present. Try rewriting
it as a join:

SELECT p.id, phrase FROM Phrase AS p, PhraseWords AS pw1,
PhraseWords AS pw2, PhraseWords AS pw3
WHERE p.id = pw1.id AND pw1.word LIKE 'WAS%'
AND p.id = pw2.id AND pw2.word LIKE 'WHIT%'
AND p.id = pw3.id AND pw3.word LIKE 'SNOW%';

(with the obvious adjustments depending on how many words in your
search phrase).

If you are using search phrases with more than half a dozen words,
you will probably need to enable GEQO planning to avoid spending
an unreasonable amount of time in planning the query. (If 'explain'
itself starts to take a long time, you are seeing excessive plan time.)

regards, tom lane

In response to

Responses

Browse pgsql-sql by date

  From Date Subject
Next Message phil 2000-02-12 01:52:50 Type casting bool as int4?
Previous Message Saltsgaver, Scott 2000-02-11 22:00:53 Techniques for quickly finding words in a phrase...