Как заменить выбор WHERE IN в предложении WHERE, чтобы сократить время выполнения запроса? - PullRequest
0 голосов
/ 28 декабря 2018

Я использую базу данных DBF в проекте C ++, написанном на RAD Studio 10.2 Tokyo.Чтобы сделать запрос к этой базе данных, я использую компонент UniDac Devart (который немного ограничен по сравнению с самим MySQL).Проблема, с которой я сталкиваюсь, заключается в том, что при использовании условия WHERE IN в запросе выполняется слишком много времени (иногда более одного часа).

У меня есть запрос:

SELECT accountrp, SUM(amounteur) AS montant FROM %s 
WHERE doctype='1' AND period<>'00' AND
matchno IN(SELECT matchno FROM %s GROUP BY matchno HAVING SUM(amounteur)<>0)
GROUP BY accountrp

accountrp, doctype, period являются символами, а amounteur является числовым.

Проблема заключается в том, что строка inchnchno IN.Я хотел бы оптимизировать запрос без использования IN.Я видел в Интернете, что условие WHERE IN может быть заменено соединениями INNER JOIN, но я не знаю, является ли это решением и как это сделать.

Можете ли вы помочь мне, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Первое предложение, которое вы можете изменить в предложении IN в INNER JOIN
, это должно быть более эффективным для производительности

SELECT accountrp, 
    SUM(amounteur) AS montant 
FROM %s  as s 
INNER JOIN  ( 
  SELECT matchno 
  FROM %s 
  GROUP BY matchno 
  HAVING SUM(amounteur)<>0
) t on t.matchno = s.matchno
WHERE doctype='1' AND period<>'00' AND
GROUP BY accountrp

это потому, что предложение In эквивалентно набору условий OR изапрос выполняется каждый раз для каждого ИЛИ .. вместо этого внутреннее соединение - это просто соединение между таблицей буксировки и выполняется только один раз

0 голосов
/ 28 декабря 2018

Вы можете попробовать ниже

SELECT s.accountrp, SUM(s.amounteur) AS montant FROM %s s
  join 
   (SELECT matchno FROM %s GROUP BY matchno HAVING SUM(amounteur)<>0) t
  on s.matchno =t.matchno
WHERE s.doctype='1' AND s.period<>'00'
GROUP BY s.accountrp
...