簡體   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