Ваш запрос в порядке, просто создайте следующие индексы:
tbl_request_to_contact (request_id, con_id)
tbl_group_to_contact (group_id, con_id)
Поскольку таблицы, по-видимому, являются таблицами ссылок, вы хотите сделать эти композиции первичными ключами:
ALTER TABLE tbl_request_to_contact ADD CONSTRAINT pk_rc PRIMARY KEY (request_id, con_id)
ALTER TABLE tbl_group_to_contact ADD CONSTRAINT pk_gc (group_id, con_id)
, убедившись, что request_id
и group_id
идут первыми.
Также, если ваши request_id
и group_id
являются целыми числами, передайте целые числа в качестве параметров, а не строки:
SELECT con_name, con_id
FROM tbl_group_to_contact gc
JOIN tbl_contact c
ON c.id = gc.con_id
WHERE group_id = 81
AND c.id NOT IN
(
SELECT con_id
FROM tbl_request_to_contact
WHERE request_id = 124
)
, или может произойти неявное преобразование, делающее индексы непригодными.
Обновление:
Из вашего плана я вижу, что вы пропускаете индекс по tbl_group_to_contact
. Для фильтрации групп требуется полное сканирование таблицы.
Создать индекс:
CREATE UNIQUE INDEX ux_gc ON tbl_group_to_contact (group_id, con_id)