Skip site navigation (1) Skip section navigation (2)

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 (view raw or flat)
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

pgsql-sql by date

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

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group