Ниже решение этого вопроса не является точным ответом, но во многих сценариях вы пытаетесь выбрать строку и использовать ее для каких-то целей, а затем обновить ее статус с помощью «используется» или «сделано», чтобы вы не выбралиэто снова.
Решение:
Приведенный ниже запрос полезен, но в этом случае, если ваша таблица велика, я только что попробовал и увидел, что вы определенно столкнулись с проблемой производительности в этом запросе.FROM (ВЫБРАТЬ * ОТ таблицы ORDER BY dbms_random.value) WHERE rownum = 1
Таким образом, если вы установите значение rownum, как показано ниже, вы можете обойти проблему производительности.Увеличивая rownum, вы можете уменьшить возможности.Но в этом случае вы всегда будете получать строки из одной и той же 1000 строк.Если вы получаете строку из 1000 и обновляете ее статус с помощью «ИСПОЛЬЗОВАННЫХ», вы почти будете получать разные строки при каждом запросе с помощью «АКТИВНЫХ»
SELECT * FROM
( SELECT * FROM table
where rownum < 1000
and status = 'ACTIVE'
ORDER BY dbms_random.value )
WHERE rownum = 1
обновлять статус строк после его выбора, если вы не можетеобновление означает, что другая транзакция уже использовала его.Затем Вам следует попытаться получить новую строку и обновить ее статус.Кстати, получение одной и той же строки двумя разными транзакциями возможно с 0,001, поскольку rownum - 1000.