PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como retornar uma linha de amostra do banco de dados um por um


Um order by sempre será caro, especialmente se a expressão na ordem por não estiver indexada. Então não peça. Em vez disso, faça um deslocamento aleatório no count() como em suas consultas, mas faça tudo de uma vez.
with t as (
    select *
    from
        products p
        inner join
        images i using (productid)
    where
        prodtype = $sometype
)
select *
from t
offset floor(random() * (select count(*) from t))
limit 1

Esta versão pode ser mais rápida
with t as (
    select *, count(*) over() total
    from
        products p
        inner join
        images i using (productid)
    where
        prodtype = $sometype
)
select *
from t
offset floor(random() * (select total from t limit 1))
limit 1