Re: order by random?

From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Miguel <mmiranda(at)123(dot)com(dot)sv>
Cc: manuel lamas <manuel3w(at)hotmail(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: order by random?
Date: 2006-03-22 18:44:04
Message-ID: 20060322184404.GE7100@surnet.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Miguel escribió:

> Manuel, el select no devolvera los primeros 75000 y luego los ordenara
> aleatoriamente (o mas bien los desordenara) ?

Pero hombre, examina el plan de ejecucion!

alvherre=# create table foo (a serial);
CREATE TABLE
alvherre=# insert into foo default values;
INSERT 0 1
[n veces]

alvherre=# select * from foo order by random() limit 4;
a
----
1
21
20
14
(4 filas)

Bien, veo que hay algunos valores altos y otros bajos. Miremos el plan
de ejecucion:

alvherre=# explain select * from foo order by random() limit 4;
QUERY PLAN
-------------------------------------------------------------------
Limit (cost=155.13..155.14 rows=4 width=4)
-> Sort (cost=155.13..160.48 rows=2140 width=4)
Sort Key: random()
-> Seq Scan on foo (cost=0.00..36.75 rows=2140 width=4)
(4 filas)

Aca veo que primero se recorre la tabla completa, _luego_ se ordena
aleatoriamente, y finalmente se obtienen los primeros N valores de esa
tabla "ordenada". Que era lo que querias.

Ahora, si vas a _modificar_ esos registros tienes que aplicar FOR
UPDATE, pero cuidado! Si tu haces esto:

select * from foo where ... for update limit X;

y concurrentemente llamas a esa misma consulta en otra sesion, la
cantidad de registros que se devuelva puede ser menor a X! Esto es
porque el FOR UPDATE se aplica antes de LIMIT, es decir, el FOR UPDATE
puede bloquear a las otras transacciones que escojan al mismo registro;
y como esa tupla una vez que la hayas modificado y soltado el lock ya no
cumple con el WHERE, entonces no se devolvera.

Hmm, creo que esta descripcion es confusa, pero si es el caso avisa y lo
conversamos :-)

--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Pablo Braulio 2006-03-22 18:50:59 ¿Se puede poner condicionales a un insert?.
Previous Message manuel lamas 2006-03-22 18:43:52 Re: order by random?