Оптимизация запросов SQL для миллионов записей - PullRequest
0 голосов
/ 08 июля 2019

У меня есть 2 сущности Customers и Agreements.

Каждый клиент может иметь 0 .. * соглашений, которые могут быть active=1 или closed=0.

Я пытаюсь выбрать клиентов, у которых нет никаких соглашений (нет записей в таблице Agreements), или клиентов, у которых есть соглашения с флагом 'closed' = 0 в одном запросе.

Таблица соглашений содержит несколько миллионов записей.

Любые предложения, как это сделать наилучшим образом?

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Я думаю, вы хотите exists и not exists, с этой логикой:

select c.*
from customers c
where not exists (select 1
                  from Agreements a
                  where a.customerid = c.customerid
                 ) or
     exists (select 1
             from Agreements a 
             where a.customerid = c.customerid and
                   a.closed = 0
            );

Для производительности вам нужен индекс на agreements(customerid, closed).

0 голосов
/ 08 июля 2019

использовать коррелированный подзапрос, я использовал реляционный столбец customerid

select c* from customer c
where  exists( select 1 from Aggrements a where c.customerid=a.customerid
                                          and a.closed=0)
or (not exists ( select 1 from Aggrements a where c.customerid=a.customerid
                                          and a.active=1)
   )

если у вас нет индекса для столбца customerid, сделайте это первым, иначе запрос займет время

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...