Как заменить выбор WHERE IN в предложении WHERE, чтобы сократить время выполнения запроса?
Я использую базу данных 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 - числовой.
Проблема в том, что вокруг линии матчно ВО. Я хотел бы оптимизировать запрос без использования IN. Я видел в Интернете, что условие WHERE IN может быть заменено соединениями INNER JOIN, но я не знаю, является ли это решением и как это сделать.
Не могли бы вы мне помочь?
2 ответа
Первое предложение, которое вы могли бы изменить предложение 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, и запрос выполняется каждый раз для каждого OR . Вместо этого внутреннее соединение является просто соединением между таблицей буксировки и выполняется только один раз.
Вы можете попробовать с ниже
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