У меня есть 3 таблицы следующим образом:
class
id:bigint(PK)
name:varchar
principal:
id: bigint(PK)
pid:bigint
flag:boolean
uniqueConstraint(pid, flag)
entry:
cid: (FK, reference class)
pid: (FK, refernce principal)
object_id: bigint
code: tinyint
PK: (cid, pid, obj)
Запрос должен проверить наличие записи в записи, используя набор параметров.
предположим, что набор параметров выглядит следующим образом:
- имя класса: Class # 3
- основной идентификатор пользователя: 3
- основной идентификатор роли: 2
- идентификатор объекта: 45
Я написал 2 запроса, один с использованием join и один с использованием подзапрос :
Запрос номер 1:
select id from entry where pid in
(select id from principal
where (pid=2 AND role)
OR (pid=3 AND !role)
)
AND cid = (select id from class where name='Class#3')
AND object_id=45
И запрос номер 2:
select e.id from class c
inner join entry e on e.cid=c.id and c.name='Class#3'
inner join principal p on p.id=e.pid
and p.id in ( select id from principal
where (pid=2 AND role)
OR (pid=3 AND !role)
)
where e.object_id=45
Конечно, есть дополнительное условие для проверки кода, который я не включил в запросы.
Я хочу знать, какой из них работает лучше в целом масштабная производственная среда. Предположим, есть 100 строк в классе, 10000 в основном и более 250000 в «записи», и запрос (как объяснено) должен выполняться для каждого запроса, и как минимум 3000 пользователей работают в системе постоянно и одновременно в любое время.
- Какой из этих запросов будет работать лучше и почему? причина так важна для дальнейших работ
- Есть ли лучший подход для написания запроса, чем эти 2 подхода или даже лучший подход для построения схемы?
С уважением
PS: я прочитал этот вопрос о сравнении подзапроса и соединения, но мой вопрос не совсем простое сравнение