एक order by
हमेशा महंगा होगा विशेष रूप से यदि क्रम में अभिव्यक्ति अनुक्रमित नहीं है। तो आदेश मत दो। इसके बजाय count()
. में एक यादृच्छिक ऑफसेट करें जैसा कि आपके प्रश्नों में है, लेकिन यह सब एक ही बार में करें।
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
यह संस्करण तेज़ हो सकता है
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