Перепроектировать запрос без использования оператора IN - PullRequest
0 голосов
/ 09 января 2019

У меня есть запрос, как показано ниже. Этот запрос работает нормально, но, поскольку у меня есть огромный объем данных для проверки, этот запрос выполняется медленнее.

Кто-нибудь может мне помочь, как оптимизировать этот запрос?

SELECT * from trn where concat(comp_id,cus_id) 
IN (select concat(comp_id,cus_id) FROM cus where sid='A0001') 
AND docdate between ('2018-01-01') and ('2018-04-30')

Ответы [ 3 ]

0 голосов
/ 09 января 2019

Вы можете использовать EXISTS:

SELECT t.*
FROM trn t
WHERE EXISTS (SELECT 1 
              FROM cus c 
              WHERE c.sid = 'A0001' AND c.comp_id = t.comp_id AND c.cus_id = t.cus_id
             ) AND
      docdate between '2018-01-01' and '2018-04-30';
0 голосов
/ 09 января 2019

concat, вероятно, вызывает эти проблемы с производительностью, поскольку он не может использовать индексы.

Но MySQL поддерживает многоколонные подзапросы, поэтому просто удалите его:

SELECT * from trn 
where (comp_id,cus_id) IN 
        ( select comp_id,cus_id
          FROM cus 
          where sid='A0001'
        ) 
  AND docdate between ('2018-01-01') and ('2018-04-30')
0 голосов
/ 09 января 2019

Вы можете использовать JOIN, например ::

SELECT DISTINCT t.*
FROM trn t 
JOIN cus c ON t.comp_id = c.comp_id AND t.cus_id = c.cus_id
WHERE c.sid='A0001' AND t.docdate BETWEEN ('2018-01-01') AND ('2018-04-30');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...