繁体   English   中英

如何替换WHERE子句中的WHERE IN选项以减少请求的执行时间?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM