[英]How can I replace WHERE IN choices in WHERE clause to reduce execution time of the request?
我在RAD Studio 10.2 Tokyo上编写的C ++项目中使用DBF数据库。 为了在此数据库上发出请求,我使用了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是字符,countereur是数字。
问题出在matchno IN的周围。 我想在不使用IN的情况下优化请求。 我在Internet上看到可以用INNER JOIN联结代替WHERE IN条件,但我不知道这是否是解决方案以及如何执行此操作。
你能帮我吗 ?
您可以尝试以下
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
第一个建议是您可以在INNER JOIN中更改IN子句
这应该对性能更有效
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都执行查询。内部联接只是两个表之间的联接,而仅执行一次
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.