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
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? |