| From: | Arguile <arguile(at)lucentstudios(dot)com> |
|---|---|
| To: | Michal Taborsky <michal(at)taborsky(dot)cz> |
| Cc: | pgsql-general(at)postgresql(dot)org |
| Subject: | Re: Selecting random row |
| Date: | 2002-08-02 13:26:28 |
| Message-ID: | 1028294789.352.8.camel@broadswd |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-general |
On Fri, 2002-08-02 at 08:38, Michal Taborsky wrote:
> I am facing a performance problem with selecting a random row from a table.
> I do it like this:
>
> SELECT * FROM table ORDER BY random() LIMIT 1
>
> But it seems that the random() function is quite slow and backend apparently
> evaluates the function for all rows (which is logical). On a table with few
> thousand rows it takes seconds. Does anybody know a better solution to
> selecting one (or more) random rows from a table ?
This isn't tested but I'd imagine it would work faster.
SELECT * FROM table WHERE id = (SELECT id FROM table ORDER BY random()
LIMIT 1);
You still generate a random number for every record but only pull the
PKs into mem (and the one selected record) instead of the entire table.
>From what I understand of the internals this should be quicker.
Other options include keeping a lookup table with a sequential (no
breaks) key so you can use some PL language to generate a number in that
range. If your key is almost sequential anyways adding an error check -
to make sure the record exists and if not try again - might be easier.
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Sergio A. Kessler | 2002-08-02 13:38:03 | Re: []performance issues |
| Previous Message | Tourtounis Sotiris | 2002-08-02 13:23:21 | Re: How i can empty the buffers of a db |