Клиент, которого вы ищете, связан с инструментом одной из сторон. Поскольку клиент также связан с несколькими сторонами, они могут быть связаны с одним и тем же инструментом несколько раз. Вы можете использовать предложение IN
или EXISTS
, чтобы получить все инструменты, которые происходят в сторонах клиента, но вы также хотите выбрать из таблицы клиентов. Итак, вы хотите присоединиться вместо этого, и это одна из немногих ситуаций, где использование DISTINCT
действительно имеет смысл.
Что касается ваших идей:
Избавьтесь от оператора IN, который прост и будет сделан
Я не вижу причин, почему вы бы это сделали. Вы говорите, что хотите заменить IN
на несколько OR
? Это только делает запрос менее читаемым и делает то же самое внутри.
Заменить DISTINCT на GROUP BY, это действительно улучшает производительность?
Не. Это делает то же самое, но снижает читабельность. GROUP BY
для агрегации. Поскольку вы не используете какую-либо функцию агрегирования, используйте DISTINCT
. План выполнения должен быть точно таким же.
Возможно, сделайте внешний SELECT, который включает DISTINCT вокруг большого SQL без DISTINCT. Моя мысль заключается в том, что DISTINCT будет выполняться в гораздо меньшем подмножестве, чем строки 1M ++ в таблице INSTRUMENT.
Нет, шаги будут такими же: найдите стороны клиента, найдите инструменты этих сторон, которые соответствуют вашим критериям, покажите только некоторые из них.
Не вижу ничего, чтобы улучшить ваш запрос, кроме использования индексов. Я не знаю, лучше ли получать от клиента через партии инструментов или наоборот, поэтому я бы создал индексы для обоих случаев:
create index idxc1 on customer( customer_id, uoid );
create index idxp1 on party ( a_customer, a_instrument );
create index idxi1 on instrument ( uoid, a_client_bank, status, a_product_category );
create index idxi2 on instrument ( a_client_bank, status, a_product_category, uoid );
create index idxp2 on party ( a_instrument, a_customer );
create index idxc2 on customer( uoid, customer_id );
Затем запустите запрос или получите план объяснения, посмотрите, какие индексы действительно используются, и отбросьте остальные.