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

时间:2018-12-28 08:28:10

标签: mysql query-optimization unidac

我正在RAD Studio 10.2 Tokyo上编写的C ++项目中使用DBF数据库。为了在此数据库上发出请求,我使用了UniDac Devart组件(与MySQL本身相比有一点限制)。我遇到的问题是,在请求中使用WHERE IN条件时,请求执行的时间过多(有时超过一小时)。

这是我的要求:

KClass<SomeClass>

帐户,文档类型,句点是字符,而数字是数字。

问题出在matchno IN的周围。我想在不使用IN的情况下优化请求。我在Internet上看到可以用INNER JOIN联结代替WHERE IN条件,但我不知道这是否是解决方案以及如何执行此操作。

可以帮我吗?

2 个答案:

答案 0 :(得分:0)

您可以尝试以下

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

答案 1 :(得分:0)

第一个建议 您可以在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都执行查询。内部联接只是两个表之间的联接,而仅执行一次