Как предположил Энди Финкенштадт, вам лучше выбрать 4 случайных преподавателя, а затем выбрать 4 случайных значения из оставшегося набора результатов. Хотя это означает, что вы упорядочиваете по dbms_random.value
дважды - что выглядит хуже - это означает, что наборы данных, по которым вы делаете это упорядочение, намного меньше.
Вы также должны убедиться в наличии индексов согласно ответу Рэнди .
Pet peeve, "
для создания имен столбцов в оболочке, если у вас нет очень веской причины для этого, это никогда не стоит дополнительных хлопот, которые оно вызывает Для начала вам всегда придется ссылаться на них с кавычками.
Если вы хотите попробовать использовать аналитические функции, которые могут ускорить процесс, вы должны добавить distinct
в выборку с count
и заменить count(distinct c.id)
на count(distinct c.id) over ()
. Это означает, что вы рассчитываете distinct
id
для всех строк. Если бы вы добавили предложение partition by
, вы бы сделали этот счет для всего, что находится в разделе. Вы также должны полностью удалить group by
.
Я также удалил дополнительный суб-выбор, который не требовался.
select *
from ( select tp.id as tutor_id
, tp.full_name as full_name
, f.file_uri as file_uri
, f.id AS file_id
, tp.user_id
, count(distinct c.id) as course_count
from ( select *
from ( select id
, full_name
, user_id
from tutor_profiles
order by dbms_random.value )
where rownum <= 4 ) tp
left outer join users u
on u.id = tp.user_id
left outer join files f
on f.id = u.avatar_id
left outer join courses c
on tp.id = c.tutor_id
group by tp.id, tp.full_name, tp.user_id, f.file_uri, f.id
order by dbms_random.value )
where rownum <= 4